2015-02-05 2 views
0

У меня есть следующий узел в моем XML файле:Невозможно удалить пустой узел XML с помощью выражения XPath @ «// * [не (узел())]»

<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) –

+0

Вы ищут тег, который содержит пробелы, а whitespace может состоять из множества символов, например « » для вкладок или « » для новой строки и т. д. Итак, даже простой символ пробела равен значению. Таким образом, он не найдет узел с символом пробела, используя not (node ​​()). –

+0

Даже если вы используете string-length (text()), это не сработает, потому что строка будет иметь длину 1 с пробелом. –

ответ

0

Я хотел бы изменить ваше выражение XPath следующим образом:

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

Другими словами, исключить элементы, которые имеют ребенка, кроме пустого текстового узла, где «пустой» означает, не имеющие значение текста, кроме пробела.

Смежные вопросы