在循环中使用时,XML 追加子项不会写入 xml 文件

本文关键字:文件 xml 追加 循环 XML | 更新日期: 2023-09-27 17:55:42

我正在编写一个应用程序,该应用程序从几个不同的XML文件中获取数据并将它们移动到一个文件中。但是,当我尝试这样做时,它什么也没写。我的代码如下:

XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(xsh);
XmlElement dataElm = xdoc.CreateElement(@"rs:data");
string contents = "";
foreach (var i in Numbers.GetWSnumber())
{
    string curFile = @"''wwproduction02'public2'Software'PMStatus'Status'WS" + i.WeaverSetId + ".xml";
    if (File.Exists(curFile))
    {
        System.IO.StreamReader file = new System.IO.StreamReader(curFile);
        while ((contents = file.ReadLine()) != null)
        {
            dataElm.InnerText = contents;
            xdoc.DocumentElement.AppendChild(dataElm);
        }
    }
}
xdoc.Save("doc.xml");

我正在尝试实现的 XML 格式是

<xml> 
<Schema> 
schema data in here 
</Schema> 
<rs:data> 
XML from other files here 
</rs:data> 
</xml>

架构很好,由其他东西处理。任何帮助,不胜感激。谢谢。

在循环中使用时,XML 追加子项不会写入 xml 文件

首先要做的是在调试器下单步执行代码以查看它在做什么。很可能它没有找到任何要处理的数据。(例如,Numbers 不返回任何内容,curFile 不存在,或者 curFile 不包含任何数据行)。或者,程序甚至在尝试处理任何内容之前很久就抛出了异常。

使用调试器检查代码是否正在执行您假定的操作。

您还将对 XML 元素的引用追加到文档中。然后,您更改其 InnerText,并重新添加相同的引用,因此文档很可能会忽略您。

每次需要时,请尝试创建一个新的 XMLElement,而不是重用单个 XMLElement。 即在内部块中一起执行所有这些操作:

XmlElement dataElm = xdoc.CreateElement(@"rs:data");
dataElm.InnerText = contents;
xdoc.DocumentElement.AppendChild(dataElm);
我没有

看到任何明显的东西,但我的直接想法/怀疑是你没有在磁盘上找到你的XML文件。 尝试添加一个 else 子句并注销(通过 log4net 或其他方式)未找到当前文件的语句,如下所示:

if (File.Exists(curFile))
{
    System.IO.StreamReader file = new System.IO.StreamReader(curFile);
    while ((contents = file.ReadLine()) != null)
    {
        dataElm.InnerText = contents;
        xdoc.DocumentElement.AppendChild(dataElm);
    }
}
else 
{
    // log statement that file curFile was not found
}

更新

你没有关闭你的System.IO.StreamReader. 虽然我不认为这会导致您的问题,但您绝对不想让 I/O 读取器未关闭。

您需要调用System.IO.StreamReader.Close()