Как поместить узлы в родительский узел? - PullRequest
1 голос
/ 16 февраля 2020

Я хотел бы добавить родительский узел с атрибутом и поместить узлы внутри этого родительского узла. У меня есть следующее xml:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
   <row>
      <PHONE_NUM>124</PHONE_NUM>
      <PHONE_ORDER>1</PHONE_ORDER>      
   </row>
   <row>
      <PHONE_NUM>123</PHONE_NUM>
      <PHONE_ORDER>2</PHONE_ORDER>      
   </row>
   <row>
      <PHONE_NUM>181</PHONE_NUM>
      <PHONE_ORDER>3</PHONE_ORDER>      
   </row>   
</foo>

Я пробовал этот подход:

var xmlString = @"<?xml version=""1.0"" encoding=""UTF-8""?>
    <foo>
       <row>
          <PHONE_NUM>124</PHONE_NUM>
          <PHONE_ORDER>1</PHONE_ORDER>      
       </row>
       <row>
          <PHONE_NUM>123</PHONE_NUM>
          <PHONE_ORDER>2</PHONE_ORDER>      
       </row>
       <row>
          <PHONE_NUM>181</PHONE_NUM>
          <PHONE_ORDER>3</PHONE_ORDER>      
       </row>   
    </foo>";

var report = XDocument.Parse(xmlString);
var newdoc = new XDocument();
newdoc.Add(new XElement("testsuites")); 
newdoc.Root.Add(report.Root);

Но приведенный выше код генерирует без id, и порядок books стал a root:

<books>
  <foo>
      <row>
          <PHONE_NUM>124</PHONE_NUM> 
          <PHONE_ORDER>1</PHONE_ORDER> 
      </row>
      <row>
          <PHONE_NUM>123</PHONE_NUM> 
          <PHONE_ORDER>2</PHONE_ORDER> 
      </row>
      <row>
          <PHONE_NUM>181</PHONE_NUM> 
          <PHONE_ORDER>3</PHONE_ORDER> 
      </row>
      </foo>
  </books>

Я пытаюсь достичь:

<?xml version=""1.0"" encoding=""UTF-8""?>
<foo>
    <books id=""1"">
       <row>
          <PHONE_NUM>124</PHONE_NUM>
          <PHONE_ORDER>1</PHONE_ORDER>      
       </row>
       <row>
          <PHONE_NUM>123</PHONE_NUM>
          <PHONE_ORDER>2</PHONE_ORDER>      
       </row>
       <row>
          <PHONE_NUM>181</PHONE_NUM>
          <PHONE_ORDER>3</PHONE_ORDER>      
       </row>  
    </books>
</foo>

Если это возможно, было бы здорово, если будет использоваться класс XmlDocument. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2020

Этот процесс помогает вам создать нового дочернего элемента и переместить все узлы под этим новым дочерним элементом.

  1. сначала создать новый элемент.
  2. Переместить все узлы под этим новым элементом
  3. Добавьте новый элемент там, где вам нужно, в XML.
XmlDocument doc2 = new XmlDocument();
doc2.LoadXml(xmlString);

var newElement = doc2.CreateElement("body");
newElement.SetAttribute("id", "1");

var moveNodes = doc2.DocumentElement.SelectNodes("//row");
foreach(XmlNode node in moveNodes)
    newElement.AppendChild(node);

doc2.GetElementsByTagName("foo")[0].AppendChild(newElement);

Выход

<?xml version="1.0" encoding="UTF-8"?>
<foo>
    <body id="1">
        <row>
            <PHONE_NUM>124</PHONE_NUM>
            <PHONE_ORDER>1</PHONE_ORDER>
        </row>
        <row>
            <PHONE_NUM>123</PHONE_NUM>
            <PHONE_ORDER>2</PHONE_ORDER>
        </row>
        <row>
            <PHONE_NUM>181</PHONE_NUM>
            <PHONE_ORDER>3</PHONE_ORDER>
        </row>
    </body>
</foo>
1 голос
/ 16 февраля 2020

Вот что вы хотите сделать, используя класс XDocument. Это просто вопрос создания новых узлов и изменения существующих узлов с вашей спецификацией:

var report = XDocument.Parse(xmlString);
report.Root.Name = XName.Get("books", report.Root.Name.NamespaceName);
report.Root.Add(new XAttribute("id", 1));
var newDoc = new XDocument();
var newRoot = new XElement("foo");
newRoot.Add(report.Root);
newDoc.Add(newRoot);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...