다음을 통해 공유


메모리 내 XML 트리 수정 및 기능 생성(LINQ to XML)

XML 트리를 수정하는 것은 XML 문서의 모양을 변경하는 일반적인 방법입니다. 일반적인 애플리케이션은 DOM 또는 LINQ to XML과 같은 데이터 저장소에 문서를 로드합니다. 에서는 프로그래밍 인터페이스를 사용하여 노드를 삽입하거나 삭제하거나 콘텐츠를 변경합니다. XML을 파일에 저장하거나 네트워크를 통해 전송합니다.

LINQ to XML을 사용하면 함수 생성이라는 여러 시나리오에서 유용한 또 다른 방법을 사용할 수 있습니다. 함수 생성은 데이터 저장소의 자세한 조작이 아니라 데이터 수정을 변환의 문제로 처리합니다. 데이터 표현을 가져와서 한 폼에서 다른 형식으로 효율적으로 변환할 수 있는 경우 결과는 한 데이터 저장소를 가져와서 다른 셰이프를 만들기 위해 어떤 방식으로든 조작한 것과 같습니다. 기능 생성 방법의 핵심은 쿼리 결과를 생성자에 전달하는 것입니다 XDocumentXElement .

대부분의 경우 데이터 저장소를 조작하는 데 걸리는 시간의 일부에 변환 코드를 작성할 수 있으며, 결과 코드는 더 강력하고 유지 관리하기 쉽습니다. 이러한 경우 변환 방법이 더 많은 처리 능력을 사용할 수 있더라도 데이터를 수정하는 보다 효과적인 방법입니다. 개발자가 기능적 접근 방식을 잘 알고 있는 경우 대부분의 경우 결과 코드는 이해하기 쉽고 트리의 각 부분을 수정하는 코드를 쉽게 찾을 수 있습니다.

XML 트리를 수정하는 방법은 많은 DOM 프로그래머에게 더 친숙하지만, 기능적 접근 방식을 사용하여 작성된 코드는 해당 접근 방식을 아직 이해하지 못하는 개발자에게 생소하게 보일 수 있습니다. 큰 XML 트리를 약간만 수정해야 하는 경우 대부분의 경우 트리를 수정하는 방법은 CPU 시간이 줄어듭니다.

이 문서에서는 두 방법의 예를 제공합니다. 특성이 요소가 되도록 다음 간단한 XML 문서를 수정하려는 경우를 가정해 보겠습니다.

<?xml version="1.0" encoding="utf-8" ?>
<Root Data1="123" Data2="456">
  <Child1>Content</Child1>
</Root>

다음 예제 중 첫 번째 예제에서는 기존의 현재 위치 수정 방법을 사용하고, 두 번째 예제에서는 함수 생성 방법을 사용합니다.

예: 기존의 현재 위치 접근 방식을 사용하여 특성을 요소로 변환

몇 가지 절차 코드를 작성하여 특성에서 요소를 만든 다음, 다음과 같이 특성을 삭제할 수 있습니다.

XElement root = XElement.Load("Data.xml");
foreach (XAttribute att in root.Attributes()) {
    root.Add(new XElement(att.Name, (string)att));
}
root.Attributes().Remove();
Console.WriteLine(root);
Dim root As XElement = XElement.Load("Data.xml")
For Each att As XAttribute In root.Attributes()
    root.Add(New XElement(att.Name, att.Value))
Next
root.Attributes().Remove()
Console.WriteLine(root)

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

<Root>
  <Child1>Content</Child1>
  <Data1>123</Data1>
  <Data2>456</Data2>
</Root>

예: 함수 생성 방법을 사용하여 특성을 요소로 변환

반면, 기능적 접근 방식은 새 트리를 형성하고, 소스 트리에서 요소와 특성을 선택 및 선택하고, 새 트리에 추가되는 대로 적절하게 변환하는 코드로 구성됩니다.

XElement root = XElement.Load("Data.xml");
XElement newTree = new XElement("Root",
    root.Element("Child1"),
    from att in root.Attributes()
    select new XElement(att.Name, (string)att)
);
Console.WriteLine(newTree);
Dim root As XElement = XElement.Load("Data.xml")
Dim newTree As XElement = _
    <Root>
        <%= root.<Child1> %>
        <%= From att In root.Attributes() _
            Select New XElement(att.Name, att.Value) %>
    </Root>
Console.WriteLine(newTree)

이 예제에서는 첫 번째 예제와 동일한 XML을 출력합니다. 그러나 기능 접근 방식에서 새 XML의 결과 구조를 실제로 볼 수 있습니다. Root 요소의 생성, 소스 트리에서 Child1 요소를 끌어오는 코드, 그리고 소스 트리의 속성을 새 트리의 요소로 변환하는 코드를 볼 수 있습니다.

이 경우의 기능 예제는 첫 번째 예제보다 짧거나 간단하지 않습니다. 그러나 XML 트리를 변경해야 하는 경우 절차적 접근 방식은 매우 복잡하고 다소 모호해집니다. 반면, 함수 방식을 사용하는 경우 원하는 콘텐츠를 끌어오기 위해 쿼리와 식을 적절하게 포함하는 원하는 XML을 형성합니다. 기능적 접근 방식은 유지 관리하기 쉬운 코드를 생성합니다.

이 경우 함수형 접근 방식은 트리 조작 방식만큼 성능이 뛰어나지 않을 가능성이 있습니다. 주요 문제는 기능적 접근 방식이 수명이 짧은 개체를 더 많이 만든다는 것입니다. 그러나 기능적 접근 방식을 사용하면 프로그래머 생산성이 향상되는 경우 절충이 효과적입니다.

이 예제는 매우 간단한 예제이지만 두 방법 간의 철학 차이를 보여 줍니다. 기능적 접근 방식을 사용하면 더 큰 XML 문서를 변환할 때 생산성이 향상됩니다.