2009-11-03 5 views
1

xlinq를 사용하여 일부 변환을 수행하고 있으며 이러한 변환 중 일부는 문서에서 빈 요소를 남길 수 있습니다.xlinq를 사용하여 모든 비어있는 요소를 제거하십시오.

모든 변환을 완료하면 어떻게 모든 빈 요소에 대해 xdocument를 쿼리 할 수 ​​있습니까?

즉, <li> 태그 내의 유일한 요소 인 <a> 개의 태그를 모두 제거하면 빈 <li>을 어떻게 제거 할 수 있습니까?

하기 전에 :

XDocument.Parse(@"<body> 
    <ul><li><a href="#">Joy</a></li></ul> 
    <p>Hi.</p> 
</body>").Descendants("a").Remove(); 

후 :

<body> 
    <ul><li/></ul> 
    <p>Hi.</p> 
</body> 

내가 선호하는 것 :

<body> 
    <p>Hi.</p> 
</body> 

답변

10

요소 doesn't have attributedoesn't have elements이 충분하지 않은지 확인하십시오. 요소가 정말로 비어 있는지 (절대 내용이 없음) 확인해야합니다. XElement에는 속성이 있습니다. 실제로이 작업을 수행하는 데 도움이됩니다 (XElement.IsEmpty). 이 함수

var document = XDocument.Parse(@"<body><ul><li><a href='#'>Joy</a></li></ul><p>Hi.</p></body>"); 
document.Descendants("a").Remove(); 

var emptyElements = from element in document.Descendants() 
        where element.IsEmpty 
        select element; 

while (emptyElements.Any()) 
    emptyElements.Remove(); 
0

내가 가지고 올 수있는 최선이었다 ...

var emptyElements = 
    from element in document.Descendants() 
    where !element.Attributes().Any() && !element.Elements().Any() 
    select element; 


while(emptyElements.Any()) 
    emptyElements.Remove(); 

그렇다면 나는 그것이 나쁜 생각이라는 것을 깨달았습니다. 너무 많이 제거했지만 시간을내어 그 이유를 알 수 없었습니다.

1

적어 보라의 XmlNodeList는이 XML 파일

public static XmlNode RemoveNullElement(XmlNodeList xmlNodeList) 
    { 
     if (xmlNodeList.Count > 0) 
     { 
      foreach (XmlNode xmlnode in xmlNodeList) 
      { 
       RemoveNullChildAndAttibute(xmlnode); 
       return xmlnode; 
      } 
     } 

     return null; 
    } 


    public static void RemoveNullChildAndAttibute(XmlNode xmlNode) 
    { 
     if (xmlNode.HasChildNodes) 
     { 
      for (int xmlNodeCount = xmlNode.ChildNodes.Count - 1; xmlNodeCount >= 0; xmlNodeCount--) 
      { 
       RemoveNullChildAndAttibute(xmlNode.ChildNodes[xmlNodeCount]); 
      } 
     } 
     else if (xmlNode.Attributes.Count == 0) 
     { 
      if (xmlNode.ParentNode != null) 
      { 
       xmlNode.ParentNode.RemoveChild(xmlNode); 
      } 
     } 
    } 
0

여기 허용 대답은 매우 옳지 않다에서 비어있는 모든 요소와 속성을 제거하기 위해 노력할 것이 코드 희망을 시도해보십시오. 특히, <foo /> 형식의 요소 만 제거하고 <foo></foo>과 같은 요소는 남겨 둡니다.

public static void RemoveEmptyDescendants(this XNode node) 
{ 
    var empty = from e in node.Descendants() 
       where !e.Nodes().Any() && !e.Attributes().Any() 
       select e; 

    while (empty.Any()) 
    { 
     empty.Remove(); 
    } 
} 
0

IsEmpty 함수와 HasAttributes 더 도움이 모두 확인 :

같은, 여기에 완벽한 솔루션입니다.

 var emptyElements = document.Descendants() 
          .Where(element => element.IsEmpty 
              && !element.HasAttributes); 
     while (emptyElements.Any()) 
     { 
      emptyElements.Remove(); 
     } 

IsEmpty는 속성 만있는 요소에 대해 true를 반환합니다. 예 :

 <Participant xsi:nil="true"/> 
관련 문제