Tạo tệp XML bằng XDocument trong C #


83

Tôi có một List<string>"danh sách mẫu" chứa

Data1
Data2
Data3...

Cấu trúc tệp giống như

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

Tôi hiện đang sử dụng XmlDocument để thực hiện việc này.

Thí dụ:

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");

Làm cách nào để tạo cấu trúc XML giống nhau bằng XDocument?


8
Vui lòng đăng mã bạn đã viết cho đến nay. Mọi người thường không thích chỉ viết mã của bạn cho bạn.
Mitch Wheat

5
Đồng ý - điều này thực sự cực kỳ đơn giản để thực hiện trong một câu lệnh duy nhất, nhưng chỉ cho bạn câu trả lời sẽ không giúp bạn học được nhiều.
Jon Skeet

Câu trả lời:


191

LINQ to XML cho phép điều này trở nên đơn giản hơn nhiều, thông qua ba tính năng:

  • Bạn có thể xây dựng một đối tượng mà không cần biết tài liệu mà nó là một phần của
  • Bạn có thể tạo một đối tượng và cung cấp các đối tượng con làm đối số
  • Nếu một đối số có thể lặp lại, nó sẽ được lặp lại

Vì vậy, ở đây bạn chỉ có thể làm:

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");
}

Tôi đã cố tình sử dụng bố cục mã này để làm cho bản thân mã phản ánh cấu trúc của tài liệu.

Nếu bạn muốn một phần tử có chứa một nút văn bản, bạn có thể xây dựng phần tử đó chỉ bằng cách chuyển vào văn bản dưới dạng một đối số của hàm tạo khác:

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

16
Lưu ý: Nếu bạn có các phần tử cần có "văn bản bên trong", bạn hãy thêm chúng như vậy: new XElement("description","this is the inner text of the description element.");(tương tự như cách bạn thêm các cặp thuộc tính / giá trị)
Myster

Cách tiếp cận rất tốt. Tôi lúng túng trong giây lát làm thế nào để thêm các thuộc tính và biểu thức linq của các phần tử cùng một lúc. Vì vậy, nếu ai đó quan tâm, tôi chọn: new XElement("info", new object[] { new XAttribute("foo", "great"), new XAttribute("bar", "not so great") }.Concat(list.Select(x => new XElement("child", ...))))Với dòng bao bọc phù hợp, điều này lại trông khá ổn.
Sebastian Werk

0

Sử dụng phương thức .Save có nghĩa là đầu ra sẽ có BOM, điều này không phải ứng dụng nào cũng hài lòng. Nếu bạn không muốn BOM và nếu bạn không chắc chắn thì tôi khuyên bạn không nên chuyển XDocument thông qua một nhà văn:

using (var writer = new XmlTextWriter(".\\your.xml", new UTF8Encoding(false)))
{
    doc.Save(writer);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.