XmlNode.RemoveChild() 递归

Posted

技术标签:

【中文标题】XmlNode.RemoveChild() 递归【英文标题】:XmlNode.RemoveChild() recursive 【发布时间】:2010-04-30 12:26:46 【问题描述】:

我的问题如下: 如何以递归方式从 XmlNode 中删除选定的 ChildNode?我的 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="description" 的参数类型,但不是作为值的子项或具有 id="value" 的参数的值注释在 XSLT 中我会说例如://value[parent::parameter[@id='description'] and @lang='en']问题是:我有语言代码:例如“de”,如果存在 lang="de" 的值,现在我想删除所有兄弟值节点,如果 lang="de" 不存在,则删除所有兄弟节点,不包括没有任何 lang-attribute 的值(作为后备)我希望你能帮我写一个 c# 代码来递归地替换所有不需要的值节点。

【问题讨论】:

【参考方案1】:

希望这是您正在寻找的。​​p>

如果您将您的 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);
    

【讨论】:

以上是关于XmlNode.RemoveChild() 递归的主要内容,如果未能解决你的问题,请参考以下文章

递归:反转字符串

递归:反转字符串

递归地将 HDF5 文件读入 R

R中具有递归函数的KnapSack动态规划

全排列问题的递归算法(Perm)

如何在 R 中使用 SVM 进行递归特征消除