Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Pengembang LINQ ke XML yang perlu menulis program seperti editor XML, sistem transformasi, atau penulis laporan sering membutuhkan kode yang bekerja pada tingkat granularitas yang lebih baik daripada elemen dan atribut. Mereka sering perlu bekerja di tingkat simpul, memanipulasi simpul teks, instruksi pemrosesan, dan memproses komentar. Artikel ini menyediakan informasi tentang pemrograman di tingkat simpul.
Contoh: Nilai properti Parent dari simpul anak XDocument diatur ke null
Properti Parent berisi induk XElement, bukan simpul induk.
XDocument Simpul anak tidak memiliki induk XElement. Induk mereka adalah dokumen, sehingga Parent properti untuk simpul tersebut diatur ke null.
Contoh berikut menunjukkan hal ini:
XDocument doc = XDocument.Parse(@"<!-- a comment --><Root/>");
Console.WriteLine(doc.Nodes().OfType<XComment>().First().Parent == null);
Console.WriteLine(doc.Root.Parent == null);
Dim doc As XDocument = XDocument.Parse("<!-- a comment --><Root/>")
Console.WriteLine(doc.Nodes().OfType(Of XComment).First().Parent Is Nothing)
Console.WriteLine(doc.Root.Parent Is Nothing)
Contoh ini menghasilkan output berikut:
True
True
Contoh: Menambahkan teks mungkin atau mungkin tidak membuat simpul teks baru
Dalam sejumlah model pemrograman XML, simpul teks yang berdekatan selalu digabungkan. Ini kadang-kadang disebut normalisasi simpul teks. LINQ ke XML tidak menormalkan simpul teks. Jika Anda menambahkan dua node teks ke elemen yang sama, itu akan menghasilkan simpul teks yang berdekatan. Namun, jika Anda menambahkan konten yang ditentukan sebagai string daripada sebagai simpul XText , LINQ ke XML mungkin menggabungkan string dengan simpul teks yang berdekatan. Contoh berikut menunjukkan hal berikut.
XElement xmlTree = new XElement("Root", "Content");
Console.WriteLine(xmlTree.Nodes().OfType<XText>().Count());
// this doesn't add a new text node
xmlTree.Add("new content");
Console.WriteLine(xmlTree.Nodes().OfType<XText>().Count());
// this does add a new, adjacent text node
xmlTree.Add(new XText("more text"));
Console.WriteLine(xmlTree.Nodes().OfType<XText>().Count());
Dim xmlTree As XElement = <Root>Content</Root>
Console.WriteLine(xmlTree.Nodes().OfType(Of XText)().Count())
' This doesn't add a new text node.
xmlTree.Add("new content")
Console.WriteLine(xmlTree.Nodes().OfType(Of XText)().Count())
'// This does add a new, adjacent text node.
xmlTree.Add(New XText("more text"))
Console.WriteLine(xmlTree.Nodes().OfType(Of XText)().Count())
Contoh ini menghasilkan output berikut:
1
1
2
Contoh: Mengatur nilai simpul teks ke string kosong tidak menghapus simpul
Dalam beberapa model pemrograman XML, simpul teks dijamin tidak berisi string kosong. Penalarannya adalah bahwa simpul teks seperti itu tidak berdampak pada serialisasi XML. Namun, karena alasan yang sama bahwa simpul teks yang berdekatan dimungkinkan, jika Anda menghapus teks dari simpul teks dengan mengatur nilainya ke string kosong, simpul teks itu sendiri tidak akan dihapus.
XElement xmlTree = new XElement("Root", "Content");
XText textNode = xmlTree.Nodes().OfType<XText>().First();
// the following line doesn't cause the removal of the text node.
textNode.Value = "";
XText textNode2 = xmlTree.Nodes().OfType<XText>().First();
Console.WriteLine(">>{0}<<", textNode2);
Dim xmlTree As XElement = <Root>Content</Root>
Dim textNode As XText = xmlTree.Nodes().OfType(Of XText)().First()
' The following line doesn't cause the removal of the text node.
textNode.Value = ""
Dim textNode2 As XText = xmlTree.Nodes().OfType(Of XText)().First()
Console.WriteLine(">>{0}<<", textNode2)
Contoh ini menghasilkan output berikut:
>><<
Contoh: Elemen dengan satu simpul teks kosong diserialisasikan secara berbeda dari elemen tanpa simpul teks
Jika elemen hanya berisi simpul teks anak yang kosong, elemen tersebut diserialisasikan dengan sintaks tag panjang: <Child></Child>. Jika elemen tidak berisi node anak apa pun, elemen tersebut diserialisasikan dengan sintaks tag pendek: <Child />.
XElement child1 = new XElement("Child1",
new XText("")
);
XElement child2 = new XElement("Child2");
Console.WriteLine(child1);
Console.WriteLine(child2);
Dim child1 As XElement = New XElement("Child1", _
New XText("") _
)
Dim child2 As XElement = New XElement("Child2")
Console.WriteLine(child1)
Console.WriteLine(child2)
Contoh ini menghasilkan output berikut:
<Child1></Child1>
<Child2 />
Contoh: Namespace adalah atribut di pohon LINQ ke XML
Meskipun deklarasi namespace memiliki sintaks yang identik dengan atribut, di beberapa antarmuka pemrograman, seperti XSLT dan XPath, deklarasi namespace tidak dianggap sebagai atribut. Namun, di LINQ ke XML, namespace disimpan sebagai XAttribute objek di pohon XML. Jika Anda melakukan iterasi melalui atribut elemen yang berisi deklarasi namespace, deklarasi namespace adalah salah satu item dalam koleksi yang dikembalikan. Properti IsNamespaceDeclaration menunjukkan apakah suatu atribut adalah deklarasi namespace.
XElement root = XElement.Parse(
@"<Root
xmlns='http://www.adventure-works.com'
xmlns:fc='www.fourthcoffee.com'
AnAttribute='abc'/>");
foreach (XAttribute att in root.Attributes())
Console.WriteLine("{0} IsNamespaceDeclaration:{1}", att, att.IsNamespaceDeclaration);
Dim root As XElement = _
<Root
xmlns='http://www.adventure-works.com'
xmlns:fc='www.fourthcoffee.com'
AnAttribute='abc'/>
For Each att As XAttribute In root.Attributes()
Console.WriteLine("{0} IsNamespaceDeclaration:{1}", att, _
att.IsNamespaceDeclaration)
Next
Contoh ini menghasilkan output berikut:
xmlns="http://www.adventure-works.com" IsNamespaceDeclaration:True
xmlns:fc="www.fourthcoffee.com" IsNamespaceDeclaration:True
AnAttribute="abc" IsNamespaceDeclaration:False
Contoh: Metode sumbu XPath tidak mengembalikan simpul teks anak dari XDocument
LINQ ke XML memungkinkan node teks anak dari XDocument, selama node teks hanya berisi spasi kosong. Namun, model objek XPath tidak menyertakan spasi putih sebagai simpul anak dari dokumen, saat Anda melakukan iterasi melalui turunan XDocument menggunakan sumbu Nodes, simpul teks spasi putih akan dikembalikan. Namun, ketika Anda melakukan iterasi melalui anak-anak dari XDocument menggunakan metode sumbu XPath, simpul teks kosong tidak akan dikembalikan.
// Create a document with some white space child nodes of the document.
XDocument root = XDocument.Parse(
@"<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<Root/>
<!--a comment-->
", LoadOptions.PreserveWhitespace);
// count the white space child nodes using LINQ to XML
Console.WriteLine(root.Nodes().OfType<XText>().Count());
// count the white space child nodes using XPathEvaluate
Console.WriteLine(((IEnumerable)root.XPathEvaluate("text()")).OfType<XText>().Count());
' Create a document with some white space child nodes of the document.
Dim root As XDocument = XDocument.Parse( _
"<?xml version='1.0' encoding='utf-8' standalone='yes'?>" & _
vbNewLine & "<Root/>" & vbNewLine & "<!--a comment-->" & vbNewLine, _
LoadOptions.PreserveWhitespace)
' Count the white space child nodes using LINQ to XML.
Console.WriteLine(root.Nodes().OfType(Of XText)().Count())
' Count the white space child nodes using XPathEvaluate.
Dim nodes As IEnumerable = CType(root.XPathEvaluate("text()"), IEnumerable)
Console.WriteLine(nodes.OfType(Of XText)().Count())
Contoh ini menghasilkan output berikut:
3
0
Simpul deklarasi XML dari XDocument adalah properti, bukan simpul anak
Saat Anda melakukan iterasi melalui simpul anak dari XDocument, Anda tidak akan melihat objek deklarasi XML. Ini adalah properti dokumen, bukan merupakan bagian dari simpul anak dokumen tersebut.
XDocument doc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XElement("Root")
);
doc.Save("Temp.xml");
Console.WriteLine(File.ReadAllText("Temp.xml"));
// this shows that there is only one child node of the document
Console.WriteLine(doc.Nodes().Count());
Dim doc As XDocument = _
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<Root/>
doc.Save("Temp.xml")
Console.WriteLine(File.ReadAllText("Temp.xml"))
' This shows that there is only one child node of the document.
Console.WriteLine(doc.Nodes().Count())
Contoh ini menghasilkan output berikut:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Root />
1