Удаление узлов из XML с атрибутом и пространством имен

#c# #xml #xml-parsing

#c# #xml #xml-синтаксический анализ

Вопрос:

У меня есть следующий XML файл

 <files>
   <mainFile num="333">
      <DE>
        <file>
        </file>
        <file>
        </file>
      </DE>
    </mainFile>

  <mainFile num="444">
     <DE /> 
  </mainFile>

   <mainFile num="555">
     <DE>
        <file>
       </file>
        <file>
       </file>
        <file>
       </file>
    </DE>
  </mainFile>

   <mainFile num="666">
     <TLL>
     </TLL>
   </mainFile>

  </files>
  

Я хочу удалить из каждого узла <mainFile num="<number>"> все, что внутри <DE> — только если оно вызывается <DE> , в случае других узлов внутри, как <TLL> в примере, не трогайте его.

моя идея состоит в том, чтобы получить что-то вроде этого:

 <files>
    <mainFile num="333"> </mainFile> 
    <mainFile num="444"> </mainFile>
    <mainFile num="555"> </mainFile>
    <mainFile num="666">
     <TLL>
     <TLL>
    </mainFile>
 </files>
  

Есть идеи, как я могу это реализовать?

Я пытался :

             var xmlString = XElement.Parse(xmlString);
            xmlString.XPathSelectElements("//DE").Remove();

xmlString .Element("DE").Remove();
  

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

1. Да, есть несколько способов сделать это. Вы уже что-нибудь пробовали?

2. Любой вопрос, кроме подразумевающего, напишите это для меня

3. Да, я пробовал, я добавил основное из того, что я пробовал

4. И какова ваша фактическая ошибка / результат, который вы получаете с помощью кода, который вы пробовали? (Позвольте мне угадать, возможно, это как-то связано с </TLL> летними каникулами? ;))

5. летние каникулы? ЧТО?

Ответ №1:

Вы могли бы попробовать что-то вроде этого:

 XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);

    XmlNodeList nodeList;
    XmlNode root = doc.DocumentElement;

    nodeList=root.SelectNodes("descendant::mainFile");

foreach (XmlNode n in nodeList)
    {
      XmlNodeList des = n.SelectNodes("descendant::DE");
      foreach (XmlNode de in nodeList)
      {
        de.ParentNode.RemoveChild(de); 

      }     
    }