繁体   English   中英

C#-将XElement数组追加到XElement

[英]C# - Append an XElement array to XElement

我有一个ac#应用程序,在这里我对名为RevisionTree的方法中的两个xml文件进行数据比较。 我从该方法返回一个元素列表(XElement)。 BuildXml方法中,调用该方法并将列表另存为tree 接下来,我创建一个xml XElement。 然后,我遍历树中的每个元素,并将指定的后代(状态,味精,日期)添加到元素,其中每个元素都是XElement。 所以我应该看到root的xml doument,然后是重复xml的列表。 但是,当我尝试保存到作者时,出现以下错误。

错误

Exception thrown: 'System.InvalidOperationException' in System.Private.Xml.dll
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Private.Xml.dll
Token StartDocument in state Document would result in an invalid XML document.

    {
        IEnumerable<XElement>
        var tree = RevisionTree("C:\\Users\\Owner\\source\\repos\\SvnCore\\SvnCore\\old_logs.xml", "C:\\Users\\Owner\\source\\repos\\SvnCore\\SvnCore\\new_logs.xml");

        using (XmlWriter writer = XmlWriter.Create("C:\\Users\\Owner\\source\\repos\\SvnCore\\SvnCore\\Temp.xml", xmlSettings))
        {
            writer.WriteStartDocument();
            var root = new XElement("root");
            foreach (var node in tree)
            {
                root.Add(new XElement("id", node.FirstAttribute));
                root.Add(node.Descendants("status").FirstOrDefault());
                root.Add(node.Descendants("msg").FirstOrDefault());
                root.Add(node.Descendants("date").FirstOrDefault());
            }
            root.Save(writer); 
            writer.WriteEndElement();
            writer.WriteEndDocument();
        }
        return true; 
    }

在此处输入图片说明

XElement.Save自己生成整个文档-您需要XElement.WriteTo ,而不需要。 因此(简化):

var sb = new StringBuilder();
using (var sw = new StringWriter(sb))
using (XmlWriter writer = XmlWriter.Create(sw)) {
    var root = new XElement("root");
    root.Add(new XElement("id", "1"));
    root.Save(writer);  // no DocumentStart, no ElementStart
}
<?xml version="1.0" encoding="utf-16"?><root><id>1</id></root>

或(如果您想编写多个元素,或者由于其他原因想要自己控制文档节点):

using (XmlWriter writer = XmlWriter.Create(sw)) {
    writer.WriteStartDocument();
    writer.WriteStartElement("root");
    var notRoot = new XElement("notRoot");
    notRoot.Add(new XElement("id", "1"));
    notRoot.WriteTo(writer); 
    notRoot.WriteTo(writer);
}
<?xml version="1.0" encoding="utf-16"?><root><notRoot><id>1</id></notRoot><notRoot><id>1</id></notRoot></root>

请注意,我省略了End调用,因为XmlWriter将隐式处理该调用。

如果您没有对xmlSettings做任何有趣的xmlSettings ,那么整个事情就更简单了,因为XElement.Save具有直接接受文件名的重载,因此您根本不需要XmlWriter

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM