Как скопировать xml из файлов и создать новый XML-файл, но исключить определенные строки?

#c# #xml

#c# #xml

Вопрос:

У меня есть два XML-документа (doc1.xml и doc2.xml )

Я хочу скопировать содержимое объединения из doc1.xml и doc2.xml в новом файле, но я хочу исключить две строки.

Оба doc1.xml и doc2.xml имеет аналогичную структуру:

 <a>
   <b>
     <c>
     </c>
   </b>
</a>
  

Я хочу скопировать xml из одного файла во второй файл, чтобы создать новый файл, НО я хочу исключить первый узел (строку) одного из документов, чтобы выглядеть следующим образом:

 <a>
   <b>
     <c>
     </c>
   </b>
   <b>
     <c>
     </c>
   </b>
</a>
  

Моя проблема в том, что я получаю документ, который выглядит как:

 <a>
   <b>
     <c>
     </c>
   </b>
</a>
<a>
   <b>
     <c>
     </c>
   </b>
</a>
  

Мой пример кода:

     XmlDocument doc1 = new XmlDocument();
        doc1.Load("book.xml");

        XmlDocument doc2 = new XmlDocument();
        doc2.Load("alsobook.xml");

        XmlNode copiedNode = doc2.ImportNode(doc1.SelectSingleNode("/A"), true);
        doc2.DocumentElement.AppendChild(copiedNode);

        XmlNodeList nodes = doc2.SelectNodes("/A/A");

        for (int i = 0; i < nodes.Count ;   i)
        {
            nodes[i].RemoveChild(nodes[i])
        }

        string fileName = @"C:UsersAdministratorsourcereposStyleProfileTestStyleProfileTestbinMyNewFile.xml";
        if (!File.Exists(fileName))
        {
            doc2.Save(fileName);
        }
  

Комментарии:

1. Для вашей задачи лучше использовать LINQ to XML.

Ответ №1:

Проверьте это.

c #, LINQ to XML

 void Main()
{
    const string doc1 = @"e:TempDoc1.xml";
    const string doc2 = @"e:TempDoc2.xml";
    const string doc3 = @"e:TempDoc3.xml";

    XDocument xdoc1 = XDocument.Load(doc1);
    XDocument xdoc2 = XDocument.Load(doc2);
    
    var xelem = xdoc1.Descendants("b");
    xdoc2.Root.AddFirst(xelem);
    xdoc2.Save(doc3);
}
  

Ответ №2:

Вы действительно не хотите использовать низкоуровневое кодирование DOM для такого рода вещей.

В XSLT это просто:

 <a xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:copy-of select="document('doc1.xml')//b"/>
  <xsl:copy-of select="document('doc2.xml')//b"/>
</a>
  

Комментарии:

1. Я полностью согласен, что XSLT лучше подходит для таких задач.