it-swarm.dev

XDocument ou XmlDocument

Agora estou aprendendo XmlDocument mas acabei de executar em XDocument e quando tento pesquisar a diferença ou os benefícios deles não consigo encontrar algo útil, você poderia por favor me diga por que você usaria um sobre o outro?

478
Tarik

Se você estiver usando o .NET versão 3.0 ou inferior, você terá para usar XmlDocument, também conhecido como API clássica do DOM. Da mesma forma, você encontrará algumas outras APIs que esperam isso.

Se você obtiver a opção, no entanto, recomendaria usar o XDocument também conhecido como LINQ para XML. É muito mais simples para criar documentos e processá-los. Por exemplo, é a diferença entre:

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

e

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

Os namespaces são muito fáceis de trabalhar no LINQ to XML, diferente de qualquer outra API XML que já vi:

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

O LINQ to XML também funciona muito bem com o LINQ - seu modelo de construção permite que você construa elementos com sequências de subelementos muito facilmente:

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

É tudo muito mais declarativo, o que se encaixa com o estilo geral do LINQ.

Agora, como Brannon mencionou, estas são APIs na memória, em vez de streaming (embora XStreamingElement suporte a saída lenta). XmlReader e XmlWriter são as formas normais de streaming de XML no .NET, mas você pode misturar todas as APIs até certo ponto. Por exemplo, você pode transmitir um documento grande, mas usar LINQ para XML posicionando um XmlReader no início de um elemento, lendo um XElement dele e processando-o, depois passando para o próximo elemento, etc. Existem várias postagens de blog sobre isso técnica, aqui está uma que eu encontrei com uma pesquisa rápida .

474
Jon Skeet

Estou surpreso que nenhuma das respostas até agora menciona o fato de que XmlDocument não fornece informações de linha , enquanto XDocument does (através do IXmlLineInfo interface).

Isso pode ser um recurso crítico em alguns casos (por exemplo, se você deseja relatar erros em um XML ou controlar onde os elementos são definidos em geral) e é melhor estar ciente disso antes de começar a implementar usando XmlDocument, para mais tarde descobrir que você tem que mudar tudo.

53
Julien Guertault

XmlDocument é ótimo para desenvolvedores familiarizados com o modelo de objeto XML DOM. Já existe há algum tempo, e mais ou menos corresponde a um padrão W3C. Ele suporta navegação manual, bem como seleção de nó XPath.

XDocument alimenta o recurso LINQ to XML no .NET 3.5. Ele faz uso pesado de IEnumerable<> e pode ser mais fácil de se trabalhar em C # simples.

Ambos os modelos de documento requerem que você carregue todo o documento na memória (ao contrário de XmlReader por exemplo).

34
Brannon

XDocument é da API LINQ para XML e XmlDocument é a API padrão do estilo DOM para XML. Se você conhece bem o DOM e não quer aprender LINQ para XML, vá com XmlDocument. Se você é novo em ambos, confira esta página que compara os dois, e escolha qual deles você gosta mais.

Acabei de começar a usar o LINQ para XML e adoro a maneira como você cria um documento XML usando a construção funcional. É muito legal. DOM é desajeitado em comparação.

23
Daniel Chambers

Como mencionado em outros lugares, sem dúvida, o Linq to Xml facilita muito a criação e a alteração de documentos XML em comparação com XmlDocument, e a sintaxe XNamespace ns + "elementName" facilita a leitura ao lidar com namespaces.

Uma coisa que vale a pena mencionar para xsl e xpath die hards to note é que IS ainda é possível executar expressões xpath 1.0 arbitrárias em Linq 2 Xml XNodes incluindo:

using System.Xml.XPath;

e então podemos navegar e projetar dados usando xpath por meio desses métodos de extensão:

Por exemplo, dado o documento 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>

Nós podemos avaliar:

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)");
22
StuartLC

Além disso, observe que XDocument é suportado no Xbox 360 e no Windows Phone OS 7.0. Se você os segmentar, desenvolva para XDocument ou migre de XmlDocument.

14
w0land

além do comentário acima, o mesmo se aplica ao criar projetos Unity3D para o Windows 8. Você precisará usar o XDocument neste cenário também.

3
Buzzrick