无法使用XPath表达式删除空XML节点@" // * [not(node())]"

时间:2015-02-05 14:46:13

标签: c# xml xpath nodes

我的xml文件中有以下节点:

<PERSON>
  <LEOKA_DATA> </LEOKA_DATA>
</PERSON>

我无法使用以下代码(摘录)删除LEOKA代码:

        string file = CommonVariables.MainDir + @"\Schemas\RemoveEmptyTags.xsl";
        try
        {
            XmlDocument xmlDocument = new XmlDocument();

            xmlDocument.Load(tempFile); //tempfile is the xml file

            XmlNodeList emptyElements = xmlDocument.SelectNodes(@"//*[not(node())]");

            if (emptyElements != null)

                for (int i = emptyElements.Count - 1; i >= 0; i--)
                {
                    var parentNode = emptyElements[i].ParentNode;

                    if (parentNode != null)
                    {
                        if (emptyElements[i].Name != "LINE")
                            parentNode.RemoveChild(emptyElements[i]);
                    }
                }
        }
        catch (FileNotFoundException ex)
        { **something here** }

但是,如果节点如下所示,则上述代码有效(注意开始标记和结束标记之间没有空格):

<LEOKA></LEOKA> 

我也尝试使用以下代码,但没有用:

var doc = XDocument.Parse(tempfile);

var emptyElements = from descendant in doc.Descendants()
                where string.IsNullOrWhiteSpace(descendant.Value)
                select descendant;

emptyElements.Remove();

任何帮助都会非常感激。如果您需要更多详细信息,请与我们联系。感谢。

1 个答案:

答案 0 :(得分:0)

我会修改你的XPath表达式,如下所示:

XmlNodeList emptyElements = xmlDocument.SelectNodes(@"//*[not(node()[
    not(self::text()[normalize-space() = ''])
  ])]");

换句话说,排除具有除空文本节点之外的子节点的元素,其中“empty”表示没有除空格之外的文本值。