XDocument or XmlDocument

前端 未结 7 2009
灰色年华
灰色年华 2020-11-22 02:48

I am now learning XmlDocument but I\'ve just ran into XDocument and when I try to search the difference or benefits of them I can\'t find something useful, could you please

相关标签:
7条回答
  • 2020-11-22 03:26

    If you're using .NET version 3.0 or lower, you have to use XmlDocument aka the classic DOM API. Likewise you'll find there are some other APIs which will expect this.

    If you get the choice, however, I would thoroughly recommend using XDocument aka LINQ to XML. It's much simpler to create documents and process them. For example, it's the difference between:

    XmlDocument doc = new XmlDocument();
    XmlElement root = doc.CreateElement("root");
    root.SetAttribute("name", "value");
    XmlElement child = doc.CreateElement("child");
    child.InnerText = "text node";
    root.AppendChild(child);
    doc.AppendChild(root);
    

    and

    XDocument doc = new XDocument(
        new XElement("root",
                     new XAttribute("name", "value"),
                     new XElement("child", "text node")));
    

    Namespaces are pretty easy to work with in LINQ to XML, unlike any other XML API I've ever seen:

    XNamespace ns = "http://somewhere.com";
    XElement element = new XElement(ns + "elementName");
    // etc
    

    LINQ to XML also works really well with LINQ - its construction model allows you to build elements with sequences of sub-elements really easily:

    // Customers is a List<Customer>
    XElement customersElement = new XElement("customers",
        customers.Select(c => new XElement("customer",
            new XAttribute("name", c.Name),
            new XAttribute("lastSeen", c.LastOrder)
            new XElement("address",
                new XAttribute("town", c.Town),
                new XAttribute("firstline", c.Address1),
                // etc
        ));
    

    It's all a lot more declarative, which fits in with the general LINQ style.

    Now as Brannon mentioned, these are in-memory APIs rather than streaming ones (although XStreamingElement supports lazy output). XmlReader and XmlWriter are the normal ways of streaming XML in .NET, but you can mix all the APIs to some extent. For example, you can stream a large document but use LINQ to XML by positioning an XmlReader at the start of an element, reading an XElement from it and processing it, then moving on to the next element etc. There are various blog posts about this technique, here's one I found with a quick search.

    0 讨论(0)
  • 2020-11-22 03:26

    XDocument is from the LINQ to XML API, and XmlDocument is the standard DOM-style API for XML. If you know DOM well, and don't want to learn LINQ to XML, go with XmlDocument. If you're new to both, check out this page that compares the two, and pick which one you like the looks of better.

    I've just started using LINQ to XML, and I love the way you create an XML document using functional construction. It's really nice. DOM is clunky in comparison.

    0 讨论(0)
  • 2020-11-22 03:29

    XmlDocument is great for developers who are familiar with the XML DOM object model. It's been around for a while, and more or less corresponds to a W3C standard. It supports manual navigation as well as XPath node selection.

    XDocument powers the LINQ to XML feature in .NET 3.5. It makes heavy use of IEnumerable<> and can be easier to work with in straight C#.

    Both document models require you to load the entire document into memory (unlike XmlReader for example).

    0 讨论(0)
  • 2020-11-22 03:33

    I am surprised none of the answers so far mentions the fact that XmlDocument provides no line information, while XDocument does (through the IXmlLineInfo interface).

    This can be a critical feature in some cases (for example if you want to report errors in an XML, or keep track of where elements are defined in general) and you better be aware of this before you happily start to implement using XmlDocument, to later discover you have to change it all.

    0 讨论(0)
  • 2020-11-22 03:36

    I believe that XDocument makes a lot more object creation calls. I suspect that for when you're handling a lot of XML documents, XMLDocument will be faster.

    One place this happens is in managing scan data. Many scan tools output their data in XML (for obvious reasons). If you have to process a lot of these scan files, I think you'll have better performance with XMLDocument.

    0 讨论(0)
  • 2020-11-22 03:45

    Also, note that XDocument is supported in Xbox 360 and Windows Phone OS 7.0. If you target them, develop for XDocument or migrate from XmlDocument.

    0 讨论(0)
提交回复
热议问题