XML-1
<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
<CurrentStatus>
<Time Stamp= "17:22">
<price>40</price>
<amount>120</amount>
</Time>
</CurrentStatus>我首先读取XML-1,然后尝试将XML-2中的Time节点插入其中(XML-1):
//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);引发以下错误:
此操作将创建结构不正确的文档。
发布于 2018-10-16 16:15:31
您正在尝试将currentTimeNode添加为xDoc1的子文档--但是xDoc1本身就是XML文档本身,这意味着您试图将currentTimeNode添加为第二个XML根元素。但是,格式良好的XML文档必须有一个根元素,因此xDoc1.AddFirst(currentTimeNode)抛出了您正在看到的异常,因为它已经有了根元素<CurrentStatus>。
相反,应该将currentTimeNode添加到预先存在的Root of xDoc1中。
xDoc1.Root.AddFirst(currentTimeNode);或者,如果存在xDoc1.Root为null的可能性(因为您正在内存中从头构造它,而不是从已有的文件加载),则可以有条件地分配它:
if (xDoc1.Root == null)
xDoc1.Add(new XElement("CurrentStatus"));
xDoc1.Root.AddFirst(currentTimeNode);顺便说一句,用First()替换First()可能更简单,而且性能更好,因为一旦返回第一个元素,First()就不会试图枚举和实现整个查询:
var currentTimeNode = xDoc2.Descendants("Time").First(); //first decendent样品小提琴这里。
发布于 2018-10-17 18:51:13
FWIW -对于VB‘s来说,可能会遇到这种情况。
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>) 'firsthttps://stackoverflow.com/questions/52839645
复制相似问题