首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# -将XElement数组附加到XElement

C# -将XElement数组附加到XElement
EN

Stack Overflow用户
提问于 2018-10-23 13:19:25
回答 1查看 1.2K关注 0票数 0

我有一个c#应用程序,在这个应用程序中,我在一个名为RevisionTree的方法中对两个xml文件进行数据比较。我从这个方法返回一个元素列表(XElement)。在BuildXml方法中,调用该方法并将列表保存为树。接下来,我创建一个xml。然后循环遍历树中的每个元素,并将指定的后代(status、msg、date)添加到根元素中,其中每一个都是XElement。因此,我应该看到一个带有根的xml加法,然后是一个重复xml的列表。然而,当我试图将保存到写入器时,会得到以下错误.

错误

代码语言:javascript
复制
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.

代码

代码语言:javascript
复制
    {
        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; 
    }

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-24 10:37:12

XElement.Save自己生成一个完整的文档--您需要XElement.WriteTo,但它不需要。因此,要么(简化):

代码语言:javascript
复制
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
}
代码语言:javascript
复制
<?xml version="1.0" encoding="utf-16"?><root><id>1</id></root>

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

代码语言:javascript
复制
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);
}
代码语言:javascript
复制
<?xml version="1.0" encoding="utf-16"?><root><notRoot><id>1</id></notRoot><notRoot><id>1</id></notRoot></root>

注意,我省略了End调用,因为XmlWriter会隐式地处理这个问题。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52950160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档