在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
引言虽然现在Json在我们的数据交换中越来越成熟,但XML格式的数据还有很重要的地位。 C#中对XML的处理也不断优化,那么我们如何选择XML的这几款处理类 XmlReader,XDocument 和XmlDocument了? 本文就从对照的方式来总结C#中XML的用法。 简介System.Xml 命名空间(XmlDocument)为处理 XML 提供基于标准的支持。 LINQ to XML(XDocument )可以进行以下操作:
XmlReader,XDocument 和XmlDocumentXDocument 和XmlDocument会把所有的XML所有的节点加载到内存中,而XmlReader则不会把所有节点一起加载到内存,而在一定的内存下处理较大的XML。 如果XML文件结构固定,处理比较简单,建议使用XmlReader可以提高程序的性能。 如果XML文件不大或者要做复杂的处理建议使用XDocument。Linq 让程序员省去了很多繁琐冗余的代码,并且兼容设备也比较多,不像XmlDocument在一些设备和系统中不支持。
XDocument VS. XmlDocument
创建XML文档使用XmlDocument 的示例XmlDocument doc = new XmlDocument(); XmlElement name = doc.CreateElement("Name"); name.InnerText = "Patrick Hines"; XmlElement phone1 = doc.CreateElement("Phone"); phone1.SetAttribute("Type", "Home"); phone1.InnerText = "206-555-0144"; XmlElement phone2 = doc.CreateElement("Phone"); phone2.SetAttribute("Type", "Work"); phone2.InnerText = "425-555-0145"; XmlElement street1 = doc.CreateElement("Street1"); street1.InnerText = "123 Main St"; XmlElement city = doc.CreateElement("City"); city.InnerText = "Mercer Island"; XmlElement state = doc.CreateElement("State"); state.InnerText = "WA"; XmlElement postal = doc.CreateElement("Postal"); postal.InnerText = "68042"; XmlElement address = doc.CreateElement("Address"); address.AppendChild(street1); address.AppendChild(city); address.AppendChild(state); address.AppendChild(postal); XmlElement contact = doc.CreateElement("Contact"); contact.AppendChild(name); contact.AppendChild(phone1); contact.AppendChild(phone2); contact.AppendChild(address); XmlElement contacts = doc.CreateElement("Contacts"); contacts.AppendChild(contact); doc.AppendChild(contacts); 使用XDocument 的示例 XElement contacts = new XElement("Contacts", new XElement("Contact", new XElement("Name", "Patrick Hines"), new XElement("Phone", "206-555-0144", new XAttribute("Type", "Home")), new XElement("phone", "425-555-0145", new XAttribute("Type", "Work")), new XElement("Address", new XElement("Street1", "123 Main St"), new XElement("City", "Mercer Island"), new XElement("State", "WA"), new XElement("Postal", "68042") ) ) );
加载XML文件使用XmlDocument 的示例 XmlDocument booksFromFile = new XmlDocument(); booksFromFile.Load(@"books.xml"); 使用XDocument 的示例 XElement booksFromFile = XElement.Load(@"books.xml");
命名空间的处理使用XmlDocument 的示例 public void addXmlns() { string xml = @"<?xml version=""1.0""?> <kml> <Document> <Placemark> </Placemark> </Document> </kml>"; var xmldoc = new XmlDocument(); xmldoc.LoadXml(xml); xmldoc.DocumentElement.SetAttribute("xmlns", "http://www.opengis.net/kml/2.2"); xmldoc.DocumentElement.SetAttribute("xmlns:gx", "http://www.google.com/kml/ext/2.2"); xmldoc.DocumentElement.SetAttribute("xmlns:kml", "http://www.opengis.net/kml/2.2"); xmldoc.DocumentElement.SetAttribute("xmlns:atom", "http://www.w3.org/2005/Atom"); xmldoc.DocumentElement.SetAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); string message; message = xmldoc.InnerXml; Console.WriteLine(message); // shows the updated xml } 使用XDocument 的示例 示例1,增加namespace XNamespace ns = "http://somewhere.com"; XElement element = new XElement(ns + "elementName"); // etc 示例2,读取含有namespace的文件 string markup = @" <aw:Root xmlns:aw='http://www.adventure-works.com'> <aw:Child1>child one data</aw:Child1> <aw:Child2>child two data</aw:Child2> </aw:Root>";XmlReader reader = XmlReader.Create(new StringReader(markup)); XElement root = XElement.Load(reader); XmlNameTable nameTable = reader.NameTable; XmlNamespaceManager namespaceManager = new XmlNamespaceManager(nameTable); namespaceManager.AddNamespace("aw", "http://www.adventure-works.com"); XElement child1 = root.XPathSelectElement("./aw:Child1", namespaceManager); Console.WriteLine(child1);
XDocumentXDocument VS. XElement
XElement.Load()示例代码File.WriteAllText("Test.xml", @"<Root> <Child1>1</Child1> <Child2>2</Child2> <Child3>3</Child3> </Root>"); Console.WriteLine("Querying tree loaded with XElement.Load"); Console.WriteLine("----"); XElement doc = XElement.Load("Test.xml"); IEnumerable<XElement> childList = from el in doc.Elements() select el; foreach (XElement e in childList) Console.WriteLine(e);
XDocument.Load() 示例代码:File.WriteAllText("Test.xml", @"<Root> <Child1>1</Child1> <Child2>2</Child2> <Child3>3</Child3> </Root>"); Console.WriteLine("Querying tree loaded with XDocument.Load"); Console.WriteLine("----"); XDocument doc = XDocument.Load("Test.xml"); IEnumerable<XElement> childList = from el in doc.Elements() select el; foreach (XElement e in childList) Console.WriteLine(e);
XPathXPath的强大之处在于处理元素导航还可以进行计算
示例: XML文档 <xml> <foo> <baz >10</baz> <bar >baa baa</bar> <baz >20</baz> <bar /> <bar /> </foo> <foo >Text 1<moo />Text 2 </foo> </xml> C#处理计算 var node = xele.XPathSelectElement("/xml/foo[@id='123']"); var nodes = xele.XPathSelectElements( "//moo/ancestor::xml/descendant::baz[@id='1']/following-sibling::bar[not(@special='1')]"); var sum = xele.XPathEvaluate("sum(//foo[not(moo)]/baz)");
这里只是总结知识点,但具体的关于更多XPath的内容可以移步到XPath 教程
XML 批注(注释)public class MyAnnotation { private string tag; public string Tag { get { return tag; } set { tag = value; } } public MyAnnotation(string tag) { this.tag = tag; } } class Program { static void Main(string[] args) { XElement root = new XElement("Root", "content"); root.AddAnnotation(new MyAnnotation("T1")); root.AddAnnotation(new MyAnnotation("T2")); root.AddAnnotation("abc"); root.AddAnnotation("def"); IEnumerable<object> annotationList; annotationList = root.Annotations(typeof(MyAnnotation)); foreach (object ma in annotationList) Console.WriteLine(((MyAnnotation)ma).Tag); Console.WriteLine("----"); IEnumerable<object> stringAnnotationList; stringAnnotationList = root.Annotations(typeof(string)); foreach (object str in stringAnnotationList) Console.WriteLine((string)str); } }
总结现在再写XML相关的程序建议直接使用XDocument,XmlDocument只是主要还是兼容以前的代码。 另外XPath功能让XDocument如虎添翼,所以大家可以多研究下XPath. 至于XSD和XSL本文不做涉及,又需要的朋友参看参考文献
参考
2.使用XmlReader读Xml,使用XmlWriter写Xml 9.W3CSchool中提供的XML相关课程 Introduction to XML and XSLT in C# .NET |
请发表评论