Azure Functions合并同结构XML文件及XmlDocument加载问题求助
Azure Functions实现XML文件合并及XmlDocument加载问题解决
解决XmlDocument加载问题
XmlDocument没有Open方法,正确加载数据的方式有两种:
- 从MemoryStream加载:下载流后需要将流的位置重置到起始处(
memoryStream.Position = 0),再调用XmlDocument.Load(memoryStream)。 - 从字符串加载:直接用
await blockBlob.DownloadTextAsync()获取XML字符串,再调用XmlDocument.LoadXml(xmlContent)。
修正代码并实现合并逻辑
你的代码存在几处错误(比如循环中文件引用错误、异步调用阻塞、流位置未重置),以下是修正后的完整实现,包含XML合并逻辑(假设所有XML结构相同,合并根节点下的子元素):
private async Task<XmlDocument> MergeFileAsync(CloudBlobContainer container, string[] blobFiles) { XmlDocument outputDocument = new XmlDocument(); bool isFirstDocument = true; foreach (string blobName in blobFiles) { CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName); // 方式1:从字符串加载XmlDocument string xmlContent = await blockBlob.DownloadTextAsync(); XmlDocument inputDocument = new XmlDocument(); inputDocument.LoadXml(xmlContent); // 方式2:从MemoryStream加载(需重置流位置) //using (var memoryStream = new MemoryStream()) //{ // await blockBlob.DownloadToStreamAsync(memoryStream); // memoryStream.Position = 0; // 重置流到起始位置 // inputDocument.Load(memoryStream); //} if (isFirstDocument) { // 第一个文件作为输出文档的基础 outputDocument.LoadXml(xmlContent); isFirstDocument = false; } else { // 导入当前XML的根节点子元素到输出文档 XmlNode root = outputDocument.DocumentElement; foreach (XmlNode childNode in inputDocument.DocumentElement.ChildNodes) { // 导入节点(deep=true表示导入子节点) XmlNode importedNode = outputDocument.ImportNode(childNode, true); root.AppendChild(importedNode); } } } return outputDocument; }
关键说明
- 循环中正确引用当前的
blobName,而非数组本身。 - 使用
await而非.Result调用异步方法,避免阻塞线程。 - 合并时通过
ImportNode方法导入节点,确保节点属于输出文档的上下文,避免跨文档节点操作异常。 - 根据实际XML结构调整合并逻辑:如果根节点需要保留特定属性,或者合并规则不同,可修改子节点遍历和导入的逻辑。
内容的提问来源于stack exchange,提问作者Gopikrishna Karanam
相关产品推荐
相关产品推荐

