xmlnode.removechild()再帰
-
02-10-2019 - |
質問
私の問題は次のとおりです。xmlnodeから選択した子育てを再帰的に削除するにはどうすればよいですか?私のXMLファイルはように見えます...
..<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>...
親ノードがid = "description"を持つパラメーターのタイプであるが、値の子供としての値とはない場合、すべてのノード(値のタイプ)を削除したいと思います。 //value[parent::parameter[@id='description'] and @lang='en']
問題は次のとおりです。言語コードがあります。たとえば、「de」と、lang = "de"の値が存在する場合はすべての兄弟値ノードを削除し、lang-aTtributeなしで値を除外するすべての兄弟ノードを削除したい= "de"は存在しません(フォールバックとして)私が願っています、あなたは私がC#コードを書くのを手伝って、再帰的にすべての望ましくないバリューノードを置き換えることができます。
解決
うまくいけば、これがあなたが探しているものです。
xmlをaにロードすると 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);
}
}
所属していません StackOverflow