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

C# C在XML中添加节点错误:“此操作将创建结构不正确的文档。”,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,XML-1 问题:我想添加节点作为第一个子节点添加完整的时间块节点。行xDoc1.AddFirstcurrentTimeNode;引发以下错误: 此操作将创建结构不正确的文档 您正试图将currentTimeNode添加为xDoc1的子级,但xDoc1是XML文档本身,这意味着您正试图将currentTimeNode添加为第二级。但是,格式良好的XML文档必须只有一个根元素,因此xDoc1.AddFirstcurrentTimeNode会抛出您看到的异常,因为它已经有一个根元素 相反,您应该将c

XML-1

问题:我想添加节点作为第一个子节点添加完整的时间块节点。行xDoc1.AddFirstcurrentTimeNode;引发以下错误:

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

您正试图将currentTimeNode添加为xDoc1的子级,但xDoc1是XML文档本身,这意味着您正试图将currentTimeNode添加为第二级。但是,格式良好的XML文档必须只有一个根元素,因此xDoc1.AddFirstcurrentTimeNode会抛出您看到的异常,因为它已经有一个根元素

相反,您应该将currentTimeNode添加到预先存在的xDoc1中:

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

if (xDoc1.Root == null)
    xDoc1.Add(new XElement("CurrentStatus"));
xDoc1.Root.AddFirst(currentTimeNode);
顺便说一句,替换为可能更简单、性能更高,因为在返回第一个元素后,First不会尝试枚举和具体化整个查询:

var currentTimeNode = xDoc2.Descendants("Time").First(); //first decendent

小提琴示例。

FWIW-对于可能遇到这种情况的VB用户来说,它将是

    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

发生了什么?在不知道发生了什么的情况下很难说出发生了什么。@BrootsWaymb:对不起,我重命名了变量来问这个问题。发生的xDoc2基本上是xDoc2。更新了我的问题。我正在阅读第一个XML,然后尝试将时间节点从XML-2插入xDoc2文档中。-澄清一下,您正试图将其插入xDoc1,对吗?@dbc:是的,您是对的。更新了我的问题。
xDoc1.Root.AddFirst(currentTimeNode);
if (xDoc1.Root == null)
    xDoc1.Add(new XElement("CurrentStatus"));
xDoc1.Root.AddFirst(currentTimeNode);
var currentTimeNode = xDoc2.Descendants("Time").First(); //first decendent
    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