C #에서 XDocument를 사용하여 XML 파일 생성


83

List<string>포함 하는 "sampleList"가 있습니다.

Data1
Data2
Data3...

파일 구조는 다음과 같습니다.

<file>
   <name filename="sample"/>
   <date modified ="  "/>
   <info>
     <data value="Data1"/> 
     <data value="Data2"/>
     <data value="Data3"/>
   </info>
</file>

저는 현재 XmlDocument를 사용하여이 작업을 수행하고 있습니다.

예:

List<string> lst;
XmlDocument XD = new XmlDocument();
XmlElement root = XD.CreateElement("file");
XmlElement nm = XD.CreateElement("name");
nm.SetAttribute("filename", "Sample");
root.AppendChild(nm);
XmlElement date = XD.CreateElement("date");
date.SetAttribute("modified", DateTime.Now.ToString());
root.AppendChild(date);
XmlElement info = XD.CreateElement("info");
for (int i = 0; i < lst.Count; i++) 
{
    XmlElement da = XD.CreateElement("data");
    da.SetAttribute("value",lst[i]);
    info.AppendChild(da);
}
root.AppendChild(info);
XD.AppendChild(root);
XD.Save("Sample.xml");

XDocument를 사용하여 동일한 XML 구조를 어떻게 만들 수 있습니까?


8
지금까지 작성한 코드를 게시 해주세요. 사람들은 일반적으로 코드를 작성하는 것을 좋아하지 않습니다.
Mitch Wheat

5
동의 함-이것은 실제로 하나의 문장으로하는 것이 매우 간단하지만 답을주는 것만으로는 많은 것을 배우는 데 도움이되지 않습니다.
Jon Skeet

답변:


191

LINQ to XML을 사용하면 다음 세 가지 기능을 통해이 작업을 훨씬 더 간단하게 할 수 있습니다.

  • 당신은 그것이 속한 문서를 몰라도 객체를 구성 할 수 있습니다.
  • 개체를 생성하고 자식을 인수로 제공 할 수 있습니다.
  • 인수가 반복 가능한 경우 반복됩니다.

따라서 여기에서 다음을 수행 할 수 있습니다.

void Main()
{
    List<string> list = new List<string>
    {
        "Data1", "Data2", "Data3"
    };

    XDocument doc =
      new XDocument(
        new XElement("file",
          new XElement("name", new XAttribute("filename", "sample")),
          new XElement("date", new XAttribute("modified", DateTime.Now)),
          new XElement("info",
            list.Select(x => new XElement("data", new XAttribute("value", x)))
          )
        )
      );

    doc.Save("Sample.xml");
}

이 코드 레이아웃을 의도적으로 사용하여 코드 자체가 문서의 구조를 반영하도록했습니다.

텍스트 노드를 포함하는 요소를 원하는 경우 텍스트를 다른 생성자 인수로 전달하여 구성 할 수 있습니다.

// Constructs <element>text within element</element>
XElement element = new XElement("element", "text within element");

16
참고 : "내부 텍스트"가 필요한 요소가있는 경우 다음과 같이 추가합니다. new XElement("description","this is the inner text of the description element.");(속성 / 값 쌍을 추가하는 방법과 유사)
Myster

아주 좋은 접근입니다. 속성과 요소의 linq 표현을 한 번에 추가하는 방법을 잠시 고민했습니다. 그래서 누군가가 관심이 있다면, 나는 선택합니다. new XElement("info", new object[] { new XAttribute("foo", "great"), new XAttribute("bar", "not so great") }.Concat(list.Select(x => new XElement("child", ...))))적절한 줄 바꿈으로 이것은 다시 꽤 괜찮아 보입니다.
Sebastian Werk

0

.Save 메서드를 사용하면 출력에 BOM이 있지만 모든 응용 프로그램이 만족 스럽지는 않습니다. BOM을 원하지 않고 확실하지 않은 경우 원하지 않는 경우 작성자를 통해 XDocument를 전달하십시오.

using (var writer = new XmlTextWriter(".\\your.xml", new UTF8Encoding(false)))
{
    doc.Save(writer);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.