Если вы используете .NET версии 3.0 или ниже, вы должны использовать XmlDocument, а также классический DOM API. Аналогичным образом вы обнаружите, что есть и другие API, которые ожидают этого.
Если вы получите выбор, я бы рекомендовал использовать XDocument aka LINQ to XML. Гораздо проще создавать документы и обрабатывать их. Например, это разница между:
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);
и
XDocument doc = new XDocument(
new XElement("root",
new XAttribute("name", "value"),
new XElement("child", "text node")));
Пространства имен довольно просты в работе с LINQ to XML, в отличие от любого другого XML-API, который я когда-либо видел:
XNamespace ns = "http://somewhere.com";
XElement element = new XElement(ns + "elementName");
// etc
LINQ to XML также отлично работает с LINQ - его конструкционная модель позволяет вам легко создавать элементы с последовательностями подэлементов:
// 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
));
Все это намного более декларативно, что соответствует стандарту LINQ.
Теперь, как упоминал Браннон, это API-интерфейсы в памяти, а не потоковые (хотя
XStreamingElement поддерживает ленивый вывод).
XmlReader и
XmlWriter являются обычными способами потоковой передачи XML в .NET, но вы можете в какой-то мере объединить все API. Например, вы можете передавать большой документ, но использовать LINQ to XML, позиционируя
XmlReader в начале элемента, считывая
XElement из него и обрабатывая его, затем переходите к следующему элементу и т.д.