ตอนนี้ฉันกำลังเรียนรู้XmlDocument
แต่ฉันเพิ่งพบเจอXDocument
และเมื่อฉันพยายามค้นหาความแตกต่างหรือผลประโยชน์ของพวกเขาฉันไม่สามารถหาสิ่งที่มีประโยชน์ได้คุณช่วยบอกฉันหน่อยได้ไหมว่าทำไมคุณถึงใช้สิ่งอื่น
ตอนนี้ฉันกำลังเรียนรู้XmlDocument
แต่ฉันเพิ่งพบเจอXDocument
และเมื่อฉันพยายามค้นหาความแตกต่างหรือผลประโยชน์ของพวกเขาฉันไม่สามารถหาสิ่งที่มีประโยชน์ได้คุณช่วยบอกฉันหน่อยได้ไหมว่าทำไมคุณถึงใช้สิ่งอื่น
คำตอบ:
หากคุณใช้. NET เวอร์ชัน 3.0 หรือต่ำกว่าคุณต้องใช้XmlDocument
aka DOM API แบบคลาสสิก ในทำนองเดียวกันคุณจะพบว่ามี API อื่น ๆ ที่จะคาดหวังสิ่งนี้
หากคุณได้รับตัวเลือกอย่างไรก็ตามฉันขอแนะนำอย่างละเอียดให้ใช้XDocument
aka LINQ กับ 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")));
Namespaces นั้นใช้งานได้ง่ายใน LINQ ถึง XML ซึ่งแตกต่างจาก XML API อื่น ๆ ที่ฉันเคยเห็น:
XNamespace ns = "http://somewhere.com";
XElement element = new XElement(ns + "elementName");
// etc
LINQ ไปยัง 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 ทั่วไป
ขณะนี้เป็นน็กล่าวถึงเหล่านี้เป็น APIs ในหน่วยความจำมากกว่าสตรีมมิ่งคน (แม้ว่าXStreamingElement
การสนับสนุนการส่งออกขี้เกียจ) XmlReader
และXmlWriter
เป็นวิธีปกติของการสตรีม XML ใน. NET แต่คุณสามารถผสม API ทั้งหมดได้ในระดับหนึ่ง ตัวอย่างเช่นคุณสามารถสตรีมเอกสารขนาดใหญ่ แต่ใช้ LINQ ไปยัง XML โดยการวางตำแหน่งXmlReader
ที่จุดเริ่มต้นขององค์ประกอบอ่านXElement
จากมันและประมวลผลแล้วย้ายไปยังองค์ประกอบต่อไป ฯลฯ มีโพสต์บล็อกต่าง ๆ เกี่ยวกับเทคนิคนี้นี่คือหนึ่งฉันได้พบกับการค้นหาอย่างรวดเร็ว
ผมประหลาดใจไม่มีคำตอบเพื่อให้ห่างไกลกล่าวถึงความจริงที่ว่าXmlDocument
ให้ข้อมูลเส้นในขณะที่XDocument
ไม่ (ผ่านIXmlLineInfo
อินเตอร์เฟซ)
นี้อาจจะเป็นคุณลักษณะที่สำคัญในบางกรณี (ตัวอย่างเช่นถ้าคุณต้องการที่จะรายงานข้อผิดพลาดใน XML หรือติดตามการที่องค์ประกอบที่กำหนดไว้ในทั่วไป) และคุณควรที่จะตระหนักถึงเรื่องนี้ก่อนที่คุณจะมีความสุขเริ่มต้นที่จะดำเนินการโดยใช้XmlDocument
เพื่อในภายหลัง ค้นพบว่าคุณต้องเปลี่ยนทุกอย่าง
XDocument
ให้ข้อมูลบรรทัด ดูXDocument.Loadด้วยLoadOptions.SetLineInfo
เป็นอาร์กิวเมนต์ที่สอง หากคุณรู้วิธีรับข้อมูลบรรทัดด้วยXmlDocument
ฉันอยากรู้ ย้อนกลับไปเมื่อฉันเขียนคำตอบนี้ฉันไม่พบอะไรเลย คำตอบอื่น ๆ ดูเหมือนว่าจะยืนยัน: stackoverflow.com/a/33622102/253883
XmlDocument
เหมาะสำหรับนักพัฒนาที่คุ้นเคยกับโมเดลวัตถุ XML DOM มันผ่านไประยะหนึ่งแล้วและมากหรือน้อยนั้นสอดคล้องกับมาตรฐาน W3C รองรับการนำทางด้วยตนเองเช่นเดียวกับการXPath
เลือกโหนด
XDocument
เปิดใช้งานฟีเจอร์ LINQ ไปยัง XML ใน. NET 3.5 มันทำให้การใช้งานหนักIEnumerable<>
และสามารถทำงานกับ C # ได้โดยตรง
เอกสารทั้งสองรุ่นกำหนดให้คุณโหลดเอกสารทั้งหมดลงในหน่วยความจำ (ไม่เหมือนกับXmlReader
ตัวอย่าง)
XDocument
มาจาก LINQ ถึง XML API และXmlDocument
เป็นAPI ของ DOM-style มาตรฐานสำหรับ XML ถ้าคุณรู้ว่า DOM ดีและไม่ต้องการที่จะเรียนรู้ LINQ กับ XML XmlDocument
ไปกับ หากคุณยังใหม่กับทั้งคู่ลองดูหน้านี้เพื่อเปรียบเทียบทั้งสองและเลือกอันที่คุณชอบดูดีกว่า
ฉันเพิ่งเริ่มใช้ LINQ กับ XML และฉันชอบวิธีที่คุณสร้างเอกสาร XML โดยใช้โครงสร้างการทำงาน มันดีมาก. DOM เป็น clunky ในการเปรียบเทียบ
ตามที่กล่าวไว้ที่อื่นไม่ต้องสงสัย Linq เป็น Xml ทำให้การสร้างและการเปลี่ยนแปลงของเอกสาร xml เป็นเรื่องง่ายเมื่อเทียบกับXmlDocument
และXNamespace ns + "elementName"
ไวยากรณ์ทำให้การอ่านที่น่าพอใจเมื่อจัดการกับเนมสเปซ
สิ่งหนึ่งที่ควรค่าแก่การกล่าวถึงxsl
และxpath
ตายอย่างมากที่ควรทราบก็คือมันเป็นไปได้ที่จะยังคงสามารถใช้งานxpath 1.0
นิพจน์โดยพลการบน Linq 2 Xml XNodes
โดยรวมถึง:
using System.Xml.XPath;
จากนั้นเราสามารถนำทางและฉายข้อมูลโดยใช้xpath
วิธีการต่อไปนี้:
ตัวอย่างเช่นกำหนดเอกสาร 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>
เราสามารถประเมิน:
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)");
นอกจากนี้โปรดทราบว่าXDocument
ได้รับการสนับสนุนใน Xbox 360 และ Windows Phone OS 7.0 หากคุณกำหนดเป้าหมายพวกเขาพัฒนาหรือโยกย้ายจากXDocument
XmlDocument
ฉันเชื่อว่ามันXDocument
ทำให้เกิดการสร้างวัตถุมากขึ้น ฉันสงสัยว่าเมื่อคุณจัดการเอกสาร XML จำนวนมากXMLDocument
จะเร็วขึ้น
ที่เดียวที่เกิดขึ้นคือการจัดการข้อมูลสแกน เครื่องมือสแกนจำนวนมากแสดงผลข้อมูลในรูปแบบ XML (ด้วยเหตุผลที่ชัดเจน) XMLDocument
หากคุณมีการประมวลผลจำนวนมากของไฟล์ที่สแกนเหล่านี้ผมคิดว่าคุณจะมีประสิทธิภาพที่ดีขึ้นด้วย