Düğümlerle programlama (LINQ to XML)

XML düzenleyicisi, dönüştürme sistemi veya rapor yazarı gibi programlar yazması gereken LINQ to XML geliştiricileri genellikle öğelere ve özniteliklere göre daha ayrıntılı bir düzeyde çalışan kodlara ihtiyaç duyar. Genellikle düğüm düzeyinde çalışması, metin düğümlerini işlemesi, yönergeleri işlemesi ve açıklamaları işlemesi gerekir. Bu makalede düğüm düzeyinde programlama hakkında bilgi sağlanır.

Örnek: Parent XDocument'ın alt düğümlerinin özellik değerleri olarak ayarlanır null

Parent özelliği üst düğümü değil üst XElementdüğümünü içerir. alt düğümlerinin XDocument üst XElementöğesi yoktur. Üst öğe belge olduğundan, bu düğümlerin Parent özelliği olarak nullayarlanır.

Aşağıdaki örnek bunu gösterir:

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)

Bu örnek aşağıdaki çıkışı oluşturur:

True
True

Örnek: Metin eklemek yeni bir metin düğümü oluşturabilir veya oluşturmayabilir

Bir dizi XML programlama modelinde, bitişik metin düğümleri her zaman birleştirilir. Buna bazen metin düğümlerinin normalleştirilmesi denir. LINQ to XML metin düğümlerini normalleştirmez. Aynı öğeye iki metin düğümü eklerseniz, bitişik metin düğümlerine neden olur. Ancak, düğüm olarak değil XText dize olarak belirtilen içeriği eklerseniz, LINQ to XML dizeyi bitişik bir metin düğümüyle birleştirir. Aşağıdaki örnekte bunu gösterilmiştir.

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

Bu örnek aşağıdaki çıkışı oluşturur:

1
1
2

Örnek: Metin düğümü değerini boş dizeye ayarlamak düğümü silmez

Bazı XML programlama modellerinde metin düğümlerinin boş dize içermemesi garanti edilir. Bunun nedeni, böyle bir metin düğümünün XML'nin seri hale getirilmesini etkilememesidir. Ancak, bitişik metin düğümlerinin mümkün olmasıyla aynı nedenle, bir metin düğümündeki metni değerini boş dizeye ayarlayarak kaldırırsanız, metin düğümü silinmez.

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)

Bu örnek aşağıdaki çıkışı oluşturur:

>><<

Örnek: Bir boş metin düğümüne sahip bir öğe, metin düğümü olmayan bir öğeden farklı bir şekilde serileştirilir

Öğe yalnızca boş bir alt metin düğümü içeriyorsa, uzun etiket söz dizimi ile serileştirilir: <Child></Child>. Bir öğe alt düğüm içermiyorsa, kısa etiket söz dizimi ile serileştirilir: <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)

Bu örnek aşağıdaki çıkışı oluşturur:

<Child1></Child1>
<Child2 />

Örnek: Ad alanları LINQ to XML ağacındaki özniteliklerdir

Ad alanı bildirimlerinin özniteliklerle aynı söz dizimi olsa da, XSLT ve XPath gibi bazı programlama arabirimlerinde ad alanı bildirimleri öznitelik olarak kabul edilmez. Ancak, LINQ to XML'de ad alanları XML ağacında nesneler olarak XAttribute depolanır. Ad alanı bildirimi içeren bir öğenin özniteliklerini yinelerseniz, ad alanı bildirimi döndürülen koleksiyondaki öğelerden biridir. özelliği, özniteliğin IsNamespaceDeclaration ad alanı bildirimi olup olmadığını gösterir.

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

Bu örnek aşağıdaki çıkışı oluşturur:

xmlns="http://www.adventure-works.com"  IsNamespaceDeclaration:True
xmlns:fc="www.fourthcoffee.com"  IsNamespaceDeclaration:True
AnAttribute="abc"  IsNamespaceDeclaration:False

Örnek: XPath ekseni yöntemleri XDocument'ın alt metin düğümlerini döndürmez

LINQ to XML, metin düğümleri yalnızca boşluk içerdiği sürece alt XDocumentmetin düğümlerine izin verir. Ancak, XPath nesne modeli bir belgenin alt düğümleri olarak boşluk içermez, bu nedenle ekseni kullanarak Nodes alt XDocument öğelerinde yineleme yaptığınızda boşluk metin düğümleri döndürülür. Ancak, XPath ekseni yöntemlerini kullanarak bir XDocument öğesinin alt öğelerinde yineleme yaptığınızda, boşluk metin düğümleri döndürülmeyecektir.

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

Bu örnek aşağıdaki çıkışı oluşturur:

3
0

XDocument'ın XML bildirim düğümü alt düğüm değil bir özelliktir

bir XDocumentöğesinin alt düğümleri arasında yineleme yaptığınızda XML bildirim nesnesini görmezsiniz. Belgenin alt düğümü değil, özelliğidir.

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

Bu örnek aşağıdaki çıkışı oluşturur:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Root />
1