首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#在XML中添加节点:“此操作将创建结构不正确的文档。”

C#在XML中添加节点:“此操作将创建结构不正确的文档。”
EN

Stack Overflow用户
提问于 2018-10-16 16:03:59
回答 2查看 505关注 0票数 1

XML-1

代码语言:javascript
复制
<CurrentStatus>
    <Time Stamp= "12:30">
        <price>100</price>
        <amount>1</amount>
    </Time>

    <Time Stamp= "14:50">
        <price>10</price>
        <amount>5</amount>
    </Time> 

    <Time Stamp= "16:30">
        <price>10</price>
        <amount>5</amount>
    </Time>     
</CurrentStatus>

XML-2

代码语言:javascript
复制
<CurrentStatus>
    <Time Stamp= "17:22">
        <price>40</price>
        <amount>120</amount>
    </Time>               
</CurrentStatus>

我首先读取XML-1,然后尝试将XML-2中的Time节点插入其中(XML-1):

代码语言:javascript
复制
//Read first XML
XDocument xDoc1 = XDocument.Load(@"D:\myfile1.xml");

//Read second XML
XDocument xDoc2 = XDocument.Load(@"D:\myfile2.xml");
XElement currentTimeNode = xDoc2.Descendants("Time").ToList()[0]; //first decendent
//Append data
xDoc1.AddFirst(currentTimeNode); //This line throws ERROR

问题:,我想将该节点添加为第一个子节点(添加Time节点的完整块)。行xDoc1.AddFirst(currentTimeNode);引发以下错误:

此操作将创建结构不正确的文档。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-16 16:15:31

您正在尝试将currentTimeNode添加为xDoc1的子文档--但是xDoc1本身就是XML文档本身,这意味着您试图将currentTimeNode添加为第二个XML根元素。但是,格式良好的XML文档必须有一个根元素,因此xDoc1.AddFirst(currentTimeNode)抛出了您正在看到的异常,因为它已经有了根元素<CurrentStatus>

相反,应该将currentTimeNode添加到预先存在的Root of xDoc1中。

代码语言:javascript
复制
xDoc1.Root.AddFirst(currentTimeNode);

或者,如果存在xDoc1.Root为null的可能性(因为您正在内存中从头构造它,而不是从已有的文件加载),则可以有条件地分配它:

代码语言:javascript
复制
if (xDoc1.Root == null)
    xDoc1.Add(new XElement("CurrentStatus"));
xDoc1.Root.AddFirst(currentTimeNode);

顺便说一句,用First()替换First()可能更简单,而且性能更好,因为一旦返回第一个元素,First()就不会试图枚举和实现整个查询:

代码语言:javascript
复制
var currentTimeNode = xDoc2.Descendants("Time").First(); //first decendent

样品小提琴这里

票数 2
EN

Stack Overflow用户

发布于 2018-10-17 18:51:13

FWIW -对于VB‘s来说,可能会遇到这种情况。

代码语言:javascript
复制
    Dim xe1 As XElement
    Dim xe2 As XElement

    xe1 = <CurrentStatus>
              <Time Stamp="12:30">
                  <price>100</price>
                  <amount>1</amount>
              </Time>

              <Time Stamp="14:50">
                  <price>10</price>
                  <amount>5</amount>
              </Time>

              <Time Stamp="16:30">
                  <price>10</price>
                  <amount>5</amount>
              </Time>
          </CurrentStatus>

    xe2 = <CurrentStatus>
              <Time Stamp="17:22">
                  <price>40</price>
                  <amount>120</amount>
              </Time>
          </CurrentStatus>

    xe1.Add(xe2.<Time>) 'add to end
    ' OR
    ' xe1.AddFirst(xe2.<Time>) 'first
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52839645

复制
相关文章

相似问题

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