2015-02-05 71 views
0

我在XML文件中的以下节点:无法删除空的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(); 

任何帮助将非常感激。如果您需要更多详细信息,请告诉我。谢谢。

+0

可能的重复[按照包含使用XPath的空白值查找节点](http://stackoverflow.com/questions/393840/locating-the-node-by-value-containing-whitespaces-using-xpath) – 2015-02-05 14:56:24

+0

正在寻找一个包含空格的标签,并且空白可以由多个字符组成,如' '用于制表符,或' '用于换行符等等。因此,即使是一个简单的空格字符,也等于一个值。因此,它不会使用not(node())查找具有空格字符的节点。 – 2015-02-05 14:59:53

+0

即使使用字符串长度(text()),它也不起作用,因为字符串的长度为1,并带有空格char。 – 2015-02-05 15:01:18

回答

0

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

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

换句话说,排除具有比一个空的文本节点,其中“空”指除空白,没有任何文本值以外的子元素。