XML 트리에서 요소, 특성 및 노드 제거(LINQ to XML)

XML 트리를 수정하여 요소, 특성 및 다른 형식의 노드를 제거할 수 있습니다.

XML 문서에서 요소나 특성을 하나만 제거하는 것은 간단합니다. 그러나 요소나 특성의 컬렉션을 제거하는 경우 먼저 컬렉션을 목록으로 구체화한 다음 요소나 특성을 목록에서 삭제해야 합니다. 이를 수행하기 위해 Remove 확장 메서드를 사용하는 것이 가장 좋습니다.

이 방식을 사용하는 주요 이유는 XML 트리에서 검색하는 대부분의 컬렉션이 지연 실행을 사용하여 생성된다는 것입니다. 먼저 목록으로 구체화하지 않거나 확장 메서드를 사용하지 않으면 특정 종류의 버그가 발생할 수 있습니다. 자세한 내용은 혼합된 선언적/명령형 코드 버그를 참조하세요.

다음 메서드는 XML 트리에서 노드와 특성을 제거합니다.

메서드 설명
XAttribute.Remove 부모에서 XAttribute를 제거합니다.
XContainer.RemoveNodes XContainer에서 자식 노드를 제거합니다.
XElement.RemoveAll XElement에서 콘텐츠와 특성을 제거합니다.
XElement.RemoveAttributes XElement의 특성을 제거합니다.
XElement.SetAttributeValue null 값을 전달하는 경우 특성을 제거합니다.
XElement.SetElementValue null 값을 전달하는 경우 자식 요소를 제거합니다.
XNode.Remove 부모에서 XNode를 제거합니다.
Extensions.Remove 부모 요소에서 소스 컬렉션의 모든 특성이나 요소를 제거합니다.

예: 단일 요소 제거 및 두 가지 방법으로 요소 컬렉션 제거

이 예제에서는 요소를 제거하는 세 가지 방법을 보여 줍니다. 첫째, 단일 요소를 제거합니다. 둘째, 요소의 컬렉션을 검색하고 Enumerable.ToList 연산자를 사용하여 구체화한 다음 제거합니다. 마지막으로, 요소의 컬렉션을 검색하고 Remove 확장 메서드를 사용하여 제거합니다.

ToList 연산자에 대한 자세한 내용은 데이터 형식 변환(C#)데이터 형식 변환(Visual Basic)을 참조하세요.

XElement root = XElement.Parse(@"<Root>
    <Child1>
        <GrandChild1/>
        <GrandChild2/>
        <GrandChild3/>
    </Child1>
    <Child2>
        <GrandChild4/>
        <GrandChild5/>
        <GrandChild6/>
    </Child2>
    <Child3>
        <GrandChild7/>
        <GrandChild8/>
        <GrandChild9/>
    </Child3>
</Root>");
root.Element("Child1").Element("GrandChild1").Remove();
root.Element("Child2").Elements().ToList().Remove();
root.Element("Child3").Elements().Remove();
Console.WriteLine(root);
Dim root As XElement = _
    <Root>
        <Child1>
            <GrandChild1/>
            <GrandChild2/>
            <GrandChild3/>
        </Child1>
        <Child2>
            <GrandChild4/>
            <GrandChild5/>
            <GrandChild6/>
        </Child2>
        <Child3>
            <GrandChild7/>
            <GrandChild8/>
            <GrandChild9/>
        </Child3>
    </Root>
root.<Child1>.<GrandChild1>.Remove()
root.<Child2>.Elements().ToList().Remove()
root.<Child3>.Elements().Remove()
Console.WriteLine(root)

이 예제는 다음과 같은 출력을 생성합니다.

<Root>
  <Child1>
    <GrandChild2 />
    <GrandChild3 />
  </Child1>
  <Child2 />
  <Child3 />
</Root>

첫 번째 손자 요소는 Child1에서 제거되었으며 모든 손자 요소는 Child2Child3에서 제거되었습니다.