C# XML技术总结的XDocument 和XmlDocument

引言

尽管现在Json在咱们的数据交换中更成熟,但XML格式的数目还有很重大之身份。

C#倍受针对XML的处理呢频频优化,那么我们安抉择XML的即几缓慢处理类
XmlReader,XDocument 和XmlDocument了?

本文就起对照的主意来总结C#中XML的用法。

简介

System.Xml 命名空间(XmlDocument)为处理 XML 提供基于专业的支持。

LINQ to XML(XDocument )可以开展以下操作:

  • 从文本或者流加载 XML。

  • 将 XML 序列化为文件或者流动。

  • 下效能布局从头创建 XML 树。

  • 采取 LINQ 查询来查询 XML 树。

  • 操作内存中的 XML 树。

  • 使用 XSD 验证 XML 树。

  • 结合使用这些职能将 XML 树于平种造型转换为另外一样栽形态。

 

 

XmlReader,XDocument 和XmlDocument

XDocument
和XmlDocument会将拥有的XML所有的节点加载到内存中,而XmlReader则无会见拿具有节点一起加载到内存,而在必之外存下处理比较生之XML。

要是XML文件结构固定,处理比较简单,建议使用XmlReader可以提高程序的习性。

万一XML文件不大或者只要举行复杂的拍卖建议以XDocument。Linq
让程序员省去了森麻烦冗余的代码,并且配合设备为正如多,不像XmlDocument在部分设备和系统被无支持。

 

XDocument VS. XmlDocument

 

比较项 XmlDocument(经典DOM API) XDocument (LINQ to XML API)
  需要熟悉DOM知识  
支持的.NetFramework版本 .NET version 1.0 + .NET version 3.5 or later(Linq引入后)
杂项   Unity3D projects for Windows 8.
Xbox 360 and Windows Phone OS 7.0,必须使用XDocument
Namespace  System.Xml System.Xml.Linq
LINQ to XML 不支持 支持
行号信息 不能提供行号信息 通过IXmlLineInfo提供了行号信息
命名空间 支持写 支持元素级写
XPath 不支持 支持, 参考System.Xml.XPath
注释 不支持 支持可扩展的批注集,请参见 LINQ to XML 批注
校验Schema 支持,参考Validate(ValidationEventHandler) 支持 ,参考Validate(XmlSchemaSet, ValidationEventHandler)
加载XML 成员方法加载(需要先new XmlDocument())
静态方法XElement.Load(@"books.xml")

图片 1图片 2

 

创建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);

 

XDocument 

XDocument  VS. XElement

 

XDocument  XElement
XDocument.Load() 加载整个XML文档  包括根节点 XElement.Load()不会加载XML的根节点

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

 

XPath

XPath的强硬的远在当被处理元素导航还得拓展测算

  • XPathSelectElement.aspx) –
    Single Element
  • XPathSelectElements.aspx) –
    Node Set
  • XPathEvaluate.aspx) –
    Scalars and others

示例:

XML文档

<xml>
    <foo>
        <baz id="1">10</baz>
        <bar id="2" special="1">baa baa</bar>
        <baz id="3">20</baz>
        <bar id="4" />
        <bar id="5" />
    </foo>
    <foo id="123">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本文不举行涉嫌,又用之爱侣参考参考文献

 

参考

LINQ to XML 与其他 XML
技术

 

1.通过XmlDocument读写Xml文档

2.使用XmlReader读Xml,使用XmlWriter写Xml

3.使用Linq to
xml存取XML

4.通过XmlScheme定义固定格式xml文档

5.Xml序列化或者反序列化类

6.通过XPath查找Xml节点

7.通过Xslt转化Xml格式

8.XDocument or
XmlDocument

9.W3CSchool受到提供的XML相关课程

  • XML
  • XSL
  • XSLT
  • XSL-FO
  • XPath
  • XQuery
  • XLink
  • XPointer
  • DTD
  • Schema
  • XML DOM
  • XForms
  • WAP

Introduction to XML and XSLT in C#
.NET

相关文章