2010-04-30 28 views
0

mon problème est le suivant: Comment puis-je supprimer ChildNodes sélectionnés de XmlNode récursivement? Mon fichier XML ressemble ...XmlNode.RemoveChild() récursive

..<element type="TextBox" id="xslFilePath"> 
       <parameters> 
        <parameter id="description"> 
         <value><![CDATA[Pfad zur XSL]]></value> 
         <value lang="en"><![CDATA[XSL-file's path]]></value> 
        </parameter> 
        <parameter id="tooltip"> 
         <value><![CDATA[Pfad zur XSL]]></value> 
         <value lang="en"><![CDATA[XSL-file's path]]></value> 
        </parameter> 
       </parameters> 
       <values> 
        <value><![CDATA[/include/extensions/languageReferences/xsl/default.xsl]]></value> 
       </values> 
      </element> 
      <element type="DropDownList" id="imageOrientation"> 
       <parameters> 
        <parameter id="description"> 
         <value><![CDATA[Anordnung]]></value> 
         <value lang="en"><![CDATA[Orientation]]></value> 
        </parameter> 
        <parameter id="tooltip"> 
         <value><![CDATA[Anordnung]]></value> 
         <value lang="en"><![CDATA[Orientation]]></value> 
        </parameter> 
       </parameters> 
       <items> 
        <item id="" selected="true"> 
         <parameters> 
          <parameter id="value"> 
           <value><![CDATA[vertical]]></value> 
          </parameter> 
          <parameter id="description"> 
           <value><![CDATA[senkrecht]]></value> 
           <value lang="en"><![CDATA[vertical]]></value> 
          </parameter> 
         </parameters> 
        </item> 
        <item id="" selected="false"> 
         <parameters> 
          <parameter id="value"> 
           <value><![CDATA[horizontal]]></value> 
          </parameter> 
          <parameter id="description"> 
           <value><![CDATA[waagerecht]]></value> 
           <value lang="en"><![CDATA[horizontal]]></value> 
          </parameter> 
         </parameters> 
        </item> 
       </items> 
       <values> 
        <value><![CDATA[horizontal]]></value> 
       </values> 
      </element>... 

Je voudrais supprimer tous les noeuds (type de valeur) où le parentNode est le type de paramètre avec id = « description », mais pas de valeur notes que les enfants des valeurs ou paramètre avec id = "valeur" En XSLT je dirais par exemple: //value[parent::parameter[@id='description'] and @lang='en'] Le problème est: J'ai le code de la langue: par exemple "de" et maintenant je voudrais supprimer tous les nœuds de valeur sibling une valeur avec lang = "de" existe et supprimer tous les nœuds frères excluant la valeur sans aucun attribut-lang si lang = "de" n'existe pas (comme repli) J'espère que vous pouvez m'aider à écrire un code C# pour remplacer récursivement tous les nœuds de valeur non désirés.

Répondre

3

J'espère que c'est ce que vous cherchez.

Si vous chargez du xml dans un XmlDocument, vous pouvez utiliser une méthode comme celle-ci pour supprimer les nœuds correspondant à xpath.

public void RemoveElements(XmlDocument document, string xpathForElementsToRemove) 
{ 
    if (document == null || document.DocumentElement == null) return; 
    var xmlNodeList = document.DocumentElement.SelectNodes(xpathForElementsToRemove); 
    if (xmlNodeList == null || xmlNodeList.Count == 0) return; 
    for (var n = xmlNodeList.Count - 1; n >= 0; n--) 
    { 
     var xmlNode = xmlNodeList[n]; 
     if (xmlNode.ParentNode == null) continue; 
     xmlNode.ParentNode.RemoveChild(xmlNode); 
    } 
}