다음을 통해 공유


C#에서 XML 트리 만들기(LINQ to XML)

업데이트: November 2007

이 단원에서는 C#에서 XML 트리를 만드는 방법에 대해 설명합니다.

LINQ 쿼리의 결과를 XElement의 내용으로 사용하는 방법에 대한 자세한 내용은 함수 생성(LINQ to XML)을 참조하십시오.

요소 생성

XElementXAttribute 생성자의 시그니처를 사용하여 요소나 특성의 내용을 생성자에 인수로 전달할 수 있습니다. 생성자 중 하나의 인수 수가 고정되어 있지 않기 때문에 원하는 수의 자식 요소를 전달할 수 있습니다. 물론 이러한 각 자식 요소에는 자신의 자식 요소가 포함될 수 있습니다. 각 요소에는 원하는 수의 특성을 추가할 수 있습니다.

XNode(XElement 포함) 또는 XAttribute 개체를 추가할 때 새 내용에 부모가 없으면 개체가 XML 트리에 추가되기만 합니다. 새 내용에 이미 부모가 있고 다른 XML 트리의 일부이면 새 내용이 복제되고 새로 복제된 내용이 XML 트리에 추가됩니다. 이 항목의 마지막 예제에서는 이에 대해 보여 줍니다.

contactsXElement를 만들려면 다음 코드를 사용할 수 있습니다.

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"), 
            new XElement("Phone", "206-555-0144"),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );

제대로 들여쓰는 경우 XElement 개체를 생성하는 코드는 기본 XML의 구조와 매우 유사합니다.

Visual Basic에는 XML 트리를 만드는 또 다른 방법이 있습니다. Visual Basic 프로그램에 XML 리터럴로 XML을 직접 포함할 수 있습니다. 자세한 내용은 Visual Basic의 XML 리터럴 소개를 참조하십시오.

XElement 생성자

XElement 클래스는 함수 생성을 위해 다음 생성자를 사용합니다. XElement의 다른 생성자도 있지만 함수 생성에 사용되지 않기 때문에 여기에 나와 있지 않습니다.

생성자

설명

XElement(XName name, object content)

XElement를 만듭니다. name 매개 변수는 요소의 이름을 지정하고, content는 요소의 내용을 지정합니다.

XElement(XName name)

XName을 지정된 이름으로 초기화하여 XElement를 만듭니다.

XElement(XName name, params object[] content)

XName을 지정된 이름으로 초기화하여 XElement를 만듭니다. 특성 및/또는 자식 요소는 매개 변수 목록의 내용에서 만들어집니다.

content 매개 변수는 융통성이 매우 크기 때문에 XElement의 유효한 자식인 모든 형식의 개체를 지원합니다. 이 매개 변수로 전달되는 개체의 형식에 따라 다음과 같은 규칙이 적용됩니다.

  • 문자열은 텍스트 내용으로 추가됩니다.

  • XElement는 자식 요소로 추가됩니다.

  • XAttribute는 특성으로 추가됩니다.

  • XProcessingInstruction, XComment 또는 XText는 자식 내용으로 추가됩니다.

  • IEnumerable이 열거되고 이러한 규칙이 결과에 재귀적으로 적용됩니다.

  • 다른 모든 형식의 경우 ToString 메서드가 호출되고 결과가 텍스트 내용으로 추가됩니다.

내용을 사용하여 XElement 만들기

메서드를 한 번 호출하여 간단한 내용이 포함된 XElement를 만들 수 있습니다. 이렇게 하려면 다음과 같이 내용을 두 번째 매개 변수로 지정합니다.

XElement n = new XElement("Customer", "Adventure Works");
Console.WriteLine(n);

이 예제의 결과는 다음과 같습니다.

<Customer>Adventure Works</Customer>

모든 형식의 개체를 내용으로 전달할 수 있습니다. 예를 들어, 다음 코드에서는 부동 소수점 숫자가 내용으로 포함된 요소를 만듭니다.

XElement n = new XElement("Cost", 324.50);
Console.WriteLine(n);

이 예제의 결과는 다음과 같습니다.

<Cost>324.5</Cost>

부동 소수점 숫자는 boxing되어 생성자에 전달됩니다. boxed 숫자는 문자열로 변환되고 요소의 내용으로 사용됩니다.

자식 요소를 사용하여 XElement 만들기

XElement 클래스의 인스턴스를 내용 인수로 전달하면 생성자가 자식 요소를 사용하여 요소를 만듭니다.

XElement shippingUnit = new XElement("ShippingUnit",
    new XElement("Cost", 324.50)
);
Console.WriteLine(shippingUnit);

이 예제의 결과는 다음과 같습니다.

<ShippingUnit>
  <Cost>324.5</Cost>
</ShippingUnit>

여러 자식 요소를 사용하여 XElement 만들기

많은 XElement 개체를 내용으로 전달할 수 있습니다. 각 XElement 개체는 자식 요소로 포함되어 있습니다.

XElement address = new XElement("Address",
    new XElement("Street1", "123 Main St"),
    new XElement("City", "Mercer Island"),
    new XElement("State", "WA"),
    new XElement("Postal", "68042")
);
Console.WriteLine(address);

이 예제의 결과는 다음과 같습니다.

<Address>
  <Street1>123 Main St</Street1>
  <City>Mercer Island</City>
  <State>WA</State>
  <Postal>68042</Postal>
</Address>

위의 예제를 확장하여 다음과 같이 전체 XML 트리를 만들 수 있습니다.

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"),                                                 
            new XElement("Phone", "206-555-0144"),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );
Console.WriteLine(contacts);

이 예제의 결과는 다음과 같습니다.

<Contacts>
  <Contact>
    <Name>Patrick Hines</Name>
    <Phone>206-555-0144</Phone>
    <Address>
      <Street1>123 Main St</Street1>
      <City>Mercer Island</City>
      <State>WA</State>
      <Postal>68042</Postal>
    </Address>
  </Contact>
</Contacts>

빈 요소 만들기

XElement를 만들려면 내용을 생성자에 전달하지 않습니다. 다음 예제에서는 빈 요소를 만듭니다.

XElement n = new XElement("Customer");
Console.WriteLine(n);

이 예제의 결과는 다음과 같습니다.

<Customer />

추가와 복제 비교

위에서 설명했듯이 XNode(XElement 포함) 또는 XAttribute 개체를 추가할 때 새 내용에 부모가 없으면 개체가 XML 트리에 추가되기만 합니다. 새 내용에 이미 부모가 있고 다른 XML 트리의 일부이면 새 내용이 복제되고 새로 복제된 내용이 XML 트리에 추가됩니다.

// Create a tree with a child element.
XElement xmlTree1 = new XElement("Root",
    new XElement("Child1", 1)
);

// Create an element that is not parented.
XElement child2 = new XElement("Child2", 2);

// Create a tree and add Child1 and Child2 to it.
XElement xmlTree2 = new XElement("Root",
    xmlTree1.Element("Child1"),
    child2
);

// Compare Child1 identity.
Console.WriteLine("Child1 was {0}",
    xmlTree1.Element("Child1") == xmlTree2.Element("Child1") ?
    "attached" : "cloned");

// Compare Child2 identity.
Console.WriteLine("Child2 was {0}",
    child2 == xmlTree2.Element("Child2") ?
    "attached" : "cloned");

이 예제의 결과는 다음과 같습니다.

Child1 was cloned
Child2 was attached

참고 항목

개념

XML 트리 만들기