Làm cách nào để tạo XML hợp lệ trong C#?Làm thế nào tôi có thể xây dựng XML trong C#?
Trả lời
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 và (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
) .
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.
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
Sử dụng XElement của System.Xml.Linq để tạo xml rất thuận tiện – Jemsworld
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.
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
Đố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.
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.
Đố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.
Trong quá khứ tôi đã tạo XML Schema của mình, sau đó sử dụng một công cụ để tạo các lớp C# sẽ tuần tự hóa cho lược đồ đó. Công cụ định nghĩa lược đồ XML là một ví dụ
http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx
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.
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. –
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.) –
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ờ?) –
Đ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).
Lưu ý rằng hiện tại, dự án này dường như khá gần với cái chết. –
@James: '[cần dẫn nguồn]' –
@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. –
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)
)
);
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);
}
}
}
}
}
- 1. Tôi có thể kết hợp nhà xây dựng trong C#
- 2. Làm thế nào tôi có thể xây dựng WAR với Maven trong Eclipse?
- 3. Làm thế nào tôi có thể xây dựng một chuỗi json trong javascript/jquery?
- 4. Làm thế nào tôi có thể xây dựng một ngữ pháp sạch, giống Python trong ANTLR?
- 5. Trong scons, làm thế nào tôi có thể tiêm một mục tiêu được xây dựng?
- 6. Làm thế nào tôi có thể tự động hóa việc triển khai xây dựng trong jenkins?
- 7. Làm thế nào tôi có thể xây dựng một truy vấn dựa tình trạng laravel
- 8. Làm thế nào tôi có thể xây dựng một cây gia đình với Perl?
- 9. Làm thế nào tôi có thể tĩnh xây dựng GDB từ nguồn?
- 10. Làm thế nào tôi có thể xây dựng một tar từ stdin?
- 11. Làm thế nào tôi có thể xây dựng Box2D để làm việc trong Code :: Blocks/Mingw32 (Windows)
- 12. Bạn có thể sử dụng tệp xây dựng ANT làm tệp xây dựng Phing không?
- 13. C++ IDE có thể xây dựng qua SSH
- 14. Làm thế nào để xây dựng HttpPostedFileBase?
- 15. Làm thế nào tôi có thể xây dựng một 'sơ đồ cây phụ thuộc' từ giải pháp .NET của tôi
- 16. Làm thế nào để xây dựng một tokenizer trong PHP?
- 17. Tôi làm cách nào để có thể xây dựng ứng dụng Desktop cho Google Drive?
- 18. Khi bước Xây dựng không thành công trong xây dựng thành phố nhóm, tôi có thể dừng các bước xây dựng trong tương lai không?
- 19. Làm thế nào tôi có thể xây dựng lại mod_wsgi của tôi để sử dụng python 2.7.3?
- 20. Tôi làm cách nào để xây dựng OpenCV với TBB?
- 21. Làm thế nào tôi có thể thêm phụ thuộc maven vào đường dẫn xây dựng flex trong Flex Builder 3?
- 22. Làm thế nào để tôi có thể làm cho maven xây dựng thêm tài nguyên cho classpath?
- 23. Bash có thể nạp được xây dựng
- 24. Có thể xây dựng một vỏ C tương tác không?
- 25. Làm thế nào để dừng xây dựng trong Visual Studio?
- 26. làm thế nào để xây dựng lại rootfs trong buildroot
- 27. Làm thế nào tôi có thể tự động gọi một hàm tạo trong C#?
- 28. Làm thế nào tôi có thể tăng tốc quá trình xây dựng bằng cách sử dụng công cụ maven
- 29. Tôi có thể tìm ở đâu, hoặc làm cách nào để tôi có thể xây dựng, một bộ phim hoạt hình cho C#?
- 30. Làm thế nào để xây dựng XmlNodes từ XmlReader
Đừng quên về XStreaming Phần tử, http://msdn.microsoft.com/en-us/library/system.xml.linq.xstreamingelement.aspx. :) –
Đố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