2010-04-30 5 views
0

моя проблема в следующем: Как я могу удалить выбранные дочерние узлы из XmlNode рекурсивно? Мой XML-файл выглядит следующим образом ...XmlNode.RemoveChild() recursive

..<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>... 

Я хотел бы, чтобы удалить все узлы (тип значения), где ParentNode является тип параметра с идентификатором = «Описание», но не ценностными нот, как дети ценностей или параметр с id = "значение" В XSLT я бы сказал, например: //value[parent::parameter[@id='description'] and @lang='en'] Проблема в следующем: у меня есть код языка: eg «de», и теперь я хотел бы удалить все узлы значения sibling, если существует значение с lang = «de» и удалить все узлы-братья, исключая значение без какого-либо lang-attribute, если lang = «de» не существует (в качестве резервной копии) I надеюсь, вы можете помочь мне написать код C#, чтобы заменить рекурсивно все нежелательные узлы значений.

ответ

3

Надеюсь, это то, что вы ищете.

Если вы загружаете you'r xml в XmlDocument, вы можете использовать метод, подобный этому, для удаления узлов, соответствующих 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); 
    } 
}