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>...
Я хотел бы удалить все узлы (тип значения), в котором Parentnode - это тип параметра с ID = «Описание», но не Value-Notes, как дети значений или параметра с ID = «значением» в XSLT, я бы сказал, например, //value[parent::parameter[@id='description'] and @lang='en']
Проблема: у меня есть код языка: например, «de», и теперь я хотел бы удалить все узлы значения брата, если значение с Lang = «de» существует и удаляет все узлы брата, исключая значение без какого-либо атрибута Lang, если Lang = "de" не существует (как затруднись), я надеюсь, вы можете помочь мне написать код C #, чтобы рекурсивно заменил все нежелательные узлы стоимости.
Решение
Надеюсь, это то, что вы ищете.
Если вы загружаете, вы 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);
}
}