C # Добавление узла в XML ошибка: «Эта операция создаст неправильно структурированный документ». - PullRequest
0 голосов
/ 16 октября 2018

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, а затем пытаюсьчтобы вставить в него узел Time из XML-2 (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); выдается следующая ошибка:

Эта операция приведет к созданию неправильно структурированного документа.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

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
0 голосов
/ 16 октября 2018

Вы пытаетесь добавить currentTimeNode как дочерний элемент xDoc1 - но xDoc1 - это сам документ XML, что означает, что вы пытаетесь добавить currentTimeNode в качестве второго корневого элемента XML .Однако правильно сформированный XML-документ должен иметь ровно один корневой элемент, и поэтому xDoc1.AddFirst(currentTimeNode) выдает исключение, которое вы видите, поскольку у него уже есть корневой элемент <CurrentStatus>.

Вместо этого следует добавить currentTimeNodeк уже существующим Root из xDoc1:

xDoc1.Root.AddFirst(currentTimeNode);

Или, если есть вероятность, что xDoc1.Root будет нулевым (потому что вы создаете его с нуля впамяти вместо загрузки из ранее существующего файла), вы можете выделить ее условно:

if (xDoc1.Root == null)
    xDoc1.Add(new XElement("CurrentStatus"));
xDoc1.Root.AddFirst(currentTimeNode);

Кстати, может быть проще и эффективнее заменить ToList()[0] на First(), поскольку First() не будет пытаться перечислить и материализовать весь запрос после возвращения первого элемента:

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

Пример скрипта здесь .

...