2008-11-12 46 views

Trả lời

473

Nó phụ thuộc vào kịch bản. XmlSerializer chắc chắn là một cách và có lợi thế là ánh xạ trực tiếp đến một mô hình đối tượng. Trong .NET 3.5, XDocument, v.v. cũng rất thân thiện. Nếu kích thước rất lớn, thì XmlWriter là bạn của bạn.

Đối với một XDocument dụ:

Console.WriteLine(
    new XElement("Foo", 
     new XAttribute("Bar", "some & value"), 
     new XElement("Nested", "data"))); 

Hoặc cùng với XmlDocument:

XmlDocument doc = new XmlDocument(); 
XmlElement el = (XmlElement)doc.AppendChild(doc.CreateElement("Foo")); 
el.SetAttribute("Bar", "some & value"); 
el.AppendChild(doc.CreateElement("Nested")).InnerText = "data"; 
Console.WriteLine(doc.OuterXml); 

Nếu bạn đang viết một lớn dòng dữ liệu, sau đó bất kỳ của DOM phương pháp tiếp cận (ví dụ như XmlDocument/XDocument, v.v.) sẽ nhanh chóng chiếm nhiều bộ nhớ. Vì vậy, nếu bạn đang viết một tệpMB XML từ CSV, bạn có thể xem xét XmlWriter; đây là nguyên thủy hơn (một ghi một lần firehose), nhưng rất hiệu quả (tưởng tượng một vòng lặp lớn ở đây):

XmlWriter writer = XmlWriter.Create(Console.Out); 
writer.WriteStartElement("Foo"); 
writer.WriteAttributeString("Bar", "Some & value"); 
writer.WriteElementString("Nested", "data"); 
writer.WriteEndElement(); 

Cuối cùng, qua XmlSerializer:

[Serializable] 
public class Foo 
{ 
    [XmlAttribute] 
    public string Bar { get; set; } 
    public string Nested { get; set; } 
} 
... 
Foo foo = new Foo 
{ 
    Bar = "some & value", 
    Nested = "data" 
}; 
new XmlSerializer(typeof(Foo)).Serialize(Console.Out, foo); 

Đây là một mô hình tốt đẹp cho bản đồ để các lớp học, vv; tuy nhiên, nó có thể là quá mức cần thiết nếu bạn đang làm điều gì đó đơn giản (hoặc nếu XML mong muốn không thực sự có mối tương quan trực tiếp với mô hình đối tượng). Một vấn đề khác với XmlSerializer là nó không thích serialize các loại bất biến: tất cả mọi thứ phải có bộ thu thập công khai (trừ khi bạn thực hiện tất cả bằng cách triển khai IXmlSerializable, trong trường hợp này bạn không đạt được nhiều bằng cách sử dụng XmlSerializer) .

+9

Đừng quên về XStreaming Phần tử, http://msdn.microsoft.com/en-us/library/system.xml.linq.xstreamingelement.aspx. :) –

+1

Đối với ví dụ XmlWriter, điều quan trọng cần lưu ý là bạn cần đóng trình soạn thảo ở cuối để nó hoạt động đúng - writer.Close() là cần thiết sau writer.WriteEndElement(). – Marko

20

Tôi sẽ dùng thử XLINQ (đọc: LINQ to XML). Thật dễ dàng, trực quan và có thể chỉnh sửa dễ dàng.

Mẫu: Reading and Writing XML using XLinq

+1

Tôi thấy điều này thực sự hữu ích, cảm ơn Chad.Trong khi có lần serialization là câu trả lời đúng, có rất nhiều kịch bản mà thế hệ xml phức tạp trong mã là câu trả lời đúng. Đó là một sự xấu hổ C# doesnt có cùng một nội dung Xml capababilities như VB.net. Cảm ơn một lần nữa. – Russell

+1

Sử dụng XElement của System.Xml.Linq để tạo xml rất thuận tiện – Jemsworld

8

XmlWriter là cách nhanh nhất để viết XML tốt. XDocument, XMLDocument và một số công trình khác hoạt động tốt, nhưng không được tối ưu hóa để viết XML. Nếu bạn muốn viết XML càng nhanh càng tốt, bạn chắc chắn nên sử dụng XmlWriter.

+5

Tức là, nếu bạn muốn * máy tính * viết XML càng nhanh càng tốt. Nếu bạn, nhà phát triển, muốn tạo XML theo cách dễ nhất và tự nhiên nhất, XmlWriter có lẽ không phải là giải pháp! – sjy

1

Đối với những điều đơn giản, tôi chỉ sử dụng các lớp XmlDocument/XmlNode/XmlAttribute và DOM XmlDocument được tìm thấy trong System.XML.

Nó tạo XML cho tôi, tôi chỉ cần liên kết một vài mục với nhau.

Tuy nhiên, về những điều lớn hơn, tôi sử dụng tuần tự hóa XML.

9

Ngoài ra, hãy kiểm tra số XmlDocument fluent interface của Mark S. Rasmussen, điều này thực sự dễ dàng nhập/đọc đầu ra XML.

1

Đối với các trường hợp đơn giản, tôi cũng khuyên bạn nên xem XmlOutput giao diện thông thạo để xây dựng Xml.

XmlOutput thật tuyệt vời để tạo Xml đơn giản với mã có thể đọc và duy trì, trong khi tạo Xml hợp lệ. orginal post có một số ví dụ tuyệt vời.

-4

Như trên.

Tôi sử dụng stringbuilder.append().

Rất đơn giản và sau đó bạn có thể thực hiện xmldocument.load (đối tượng strinbuilder làm tham số).

Có thể bạn sẽ thấy mình sử dụng string.concat trong tham số chắp thêm, nhưng đây là một cách tiếp cận rất đơn giản.

+10

Trừ khi bạn quên mã hóa một cái gì đó đúng cách và viết Xml bất hợp pháp. –

+3

Câu trả lời này đã hoàn toàn bị đóng sầm, nhưng dựa trên câu hỏi này tôi đã xem xét một trong những triển khai của riêng tôi, nơi tôi xây dựng XML. Đối với dự án cụ thể của tôi, tôi thấy rằng xây dựng qua StringBuilder dẫn đến việc xử lý nhanh hơn 10% so với sử dụng XDocument/XmlWriter. Nhưng, tôi cảm thấy thoải mái với XML, và đó là cho dự án cụ thể của tôi. (Để tham khảo, kích thước XML cuối cùng là khoảng 3,4 MB, với hơn 8000 dòng.) –

+2

Tôi muốn tò mò muốn biết liệu bạn có đo lường sự giao dịch giữa hiệu suất ứng dụng hay không(). các kỹ sư cần phải tự làm quen với mã trong một giờ trước khi thực hiện thay đổi ngay bây giờ?) –

57

Điều tốt nhất mà tôi đã thử là LINQ to XSD (chưa được biết đến với hầu hết các nhà phát triển). Bạn cung cấp cho nó một lược đồ XSD và nó tạo ra một mô hình đối tượng hoàn toàn được ánh xạ hoàn toàn được ánh xạ (dựa trên LINQ to XML) cho bạn trong nền, thực sự dễ dàng làm việc với - và nó cập nhật và xác nhận mô hình đối tượng và XML của bạn thời gian thực. Trong khi nó vẫn còn "Xem trước", tôi đã không gặp bất kỳ lỗi nào với nó.

Nếu bạn có một Schema XSD trông như thế này:

<xs:element name="RootElement"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Element1" type="xs:string" /> 
     <xs:element name="Element2" type="xs:string" /> 
     </xs:sequence> 
     <xs:attribute name="Attribute1" type="xs:integer" use="optional" /> 
     <xs:attribute name="Attribute2" type="xs:boolean" use="required" /> 
    </xs:complexType> 
    </xs:element> 

Sau đó, bạn chỉ đơn giản là có thể xây dựng XML như thế này:

RootElement rootElement = new RootElement; 
rootElement.Element1 = "Element1"; 
rootElement.Element2 = "Element2"; 
rootElement.Attribute1 = 5; 
rootElement.Attribute2 = true; 

Hoặc đơn giản là tải một XML từ tập tin như thế này:

RootElement rootElement = RootElement.Load(filePath); 

Hoặc lưu nó như sau:

rootElement.Save(string); 
rootElement.Save(textWriter); 
rootElement.Save(xmlWriter); 

rootElement.Untyped cũng mang lại phần tử dưới dạng XElement (từ LINQ đến XML).

+4

Lưu ý rằng hiện tại, dự án này dường như khá gần với cái chết. –

+1

@James: '[cần dẫn nguồn]' –

+7

@Robert Harvey: Kiểm tra ngày nhận xét của tôi. Ba ngày sau, các cam kết/sửa chữa bắt đầu được thực hiện. Thành thật mà nói, tôi rất vui vì dự án đã quay lại, vì bây giờ tôi có thể xem nó như là một lựa chọn khả thi. –

22
new XElement("Foo", 
     from s in nameValuePairList 
     select 
      new XElement("Bar", 
        new XAttribute("SomeAttr", "SomeAttrValue"), 
          new XElement("Name", s.Name), 
          new XElement("Value", s.Value) 
         ) 
      ); 
3

Tôi nghĩ tài nguyên này đủ cho lưu/tải XML trung bình: Read/Write XML using C#.

Nhiệm vụ của tôi là lưu trữ ký hiệu âm nhạc. Tôi chọn XML, bởi vì tôi đoán .NET đã trưởng thành đủ để cho phép giải pháp dễ dàng cho công việc. Tôi đã đúng :)

Đây là nguyên mẫu tập tin bài hát của tôi:

<music judul="Kupu-Kupu yang Lucu" pengarang="Ibu Sud" tempo="120" birama="4/4" nadadasar="1=F" biramapembilang="4" biramapenyebut="4"> 
    <not angka="1" oktaf="0" naikturun="" nilai="1"/> 
    <not angka="2" oktaf="0" naikturun="" nilai="0.5"/> 
    <not angka="5" oktaf="1" naikturun="/" nilai="0.25"/> 
    <not angka="2" oktaf="0" naikturun="\" nilai="0.125"/> 
    <not angka="1" oktaf="0" naikturun="" nilai="0.0625"/> 
</music> 

Điều đó có thể được giải quyết khá dễ dàng:

Đối với Lưu vào File:

private void saveToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    saveFileDialog1.Title = "Save Song File"; 
    saveFileDialog1.Filter = "Song Files|*.xsong"; 
    if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
    { 
     FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create); 
     XmlTextWriter w = new XmlTextWriter(fs, Encoding.UTF8); 
     w.WriteStartDocument(); 
     w.WriteStartElement("music"); 
     w.WriteAttributeString("judul", Program.music.getTitle()); 
     w.WriteAttributeString("pengarang", Program.music.getAuthor()); 
     w.WriteAttributeString("tempo", Program.music.getTempo()+""); 
     w.WriteAttributeString("birama", Program.music.getBirama()); 
     w.WriteAttributeString("nadadasar", Program.music.getNadaDasar()); 
     w.WriteAttributeString("biramapembilang", Program.music.getBiramaPembilang()+""); 
     w.WriteAttributeString("biramapenyebut", Program.music.getBiramaPenyebut()+""); 

     for (int i = 0; i < listNotasi.Count; i++) 
     { 
      CNot not = listNotasi[i]; 
      w.WriteStartElement("not"); 
      w.WriteAttributeString("angka", not.getNot() + ""); 
      w.WriteAttributeString("oktaf", not.getOktaf() + ""); 
      String naikturun=""; 
      if(not.isTurunSetengah())naikturun="\\"; 
      else if(not.isNaikSetengah())naikturun="/"; 
      w.WriteAttributeString("naikturun",naikturun); 
      w.WriteAttributeString("nilai", not.getNilaiNot()+""); 
      w.WriteEndElement(); 
     } 
     w.WriteEndElement(); 

     w.Flush(); 
     fs.Close(); 
    } 

} 

Đối với tập tin tải:

openFileDialog1.Title = "Open Song File"; 
openFileDialog1.Filter = "Song Files|*.xsong"; 
if (openFileDialog1.ShowDialog() == DialogResult.OK) 
{ 
    FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open); 
    XmlTextReader r = new XmlTextReader(fs); 

    while (r.Read()) 
    { 
     if (r.NodeType == XmlNodeType.Element) 
     { 
      if (r.Name.ToLower().Equals("music")) 
      { 
       Program.music = new CMusic(r.GetAttribute("judul"), 
        r.GetAttribute("pengarang"), 
        r.GetAttribute("birama"), 
        Convert.ToInt32(r.GetAttribute("tempo")), 
        r.GetAttribute("nadadasar"), 
        Convert.ToInt32(r.GetAttribute("biramapembilang")), 
        Convert.ToInt32(r.GetAttribute("biramapenyebut"))); 
      } 
      else 
       if (r.Name.ToLower().Equals("not")) 
       { 
        CNot not = new CNot(Convert.ToInt32(r.GetAttribute("angka")), Convert.ToInt32(r.GetAttribute("oktaf"))); 
        if (r.GetAttribute("naikturun").Equals("/")) 
        { 
         not.setNaikSetengah(); 
        } 
        else if (r.GetAttribute("naikturun").Equals("\\")) 
        { 
         not.setTurunSetengah(); 
        } 
        not.setNilaiNot(Convert.ToSingle(r.GetAttribute("nilai"))); 
        listNotasi.Add(not); 
       } 
     } 
     else 
      if (r.NodeType == XmlNodeType.Text) 
      { 
       Console.WriteLine("\tVALUE: " + r.Value); 
      } 
    } 
} 

} 
} 
Các vấn đề liên quan