C# C在XML中添加节点错误:“此操作将创建结构不正确的文档。”
XML-1 问题:我想添加节点作为第一个子节点添加完整的时间块节点。行xDoc1.AddFirstcurrentTimeNode;引发以下错误: 此操作将创建结构不正确的文档 您正试图将currentTimeNode添加为xDoc1的子级,但xDoc1是XML文档本身,这意味着您正试图将currentTimeNode添加为第二级。但是,格式良好的XML文档必须只有一个根元素,因此xDoc1.AddFirstcurrentTimeNode会抛出您看到的异常,因为它已经有一个根元素 相反,您应该将currentTimeNode添加到预先存在的xDoc1中: 或者,如果xDoc1.Root可能为null,因为您是在内存中从头开始构造它,而不是从预先存在的文件加载,则可以有条件地分配它: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
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