Bagikan melalui


Cara men-debug kumpulan hasil kueri kosong (LINQ ke XML)

Salah satu masalah yang paling umum ketika query pohon XML adalah bahwa jika pohon XML memiliki namespace layanan default, pengembang kadang-kadang menulis query seolah-olah XML tidak berada di namespace layanan.

Kumpulan contoh pertama dalam artikel ini menunjukkan cara khas bahwa XML di namespace layanan default dimuat, dan kemudian dikuerikan dengan tidak benar.

Kumpulan contoh kedua menunjukkan koreksi yang diperlukan sehingga Anda dapat mengkueri XML di namespace layanan.

Untuk informasi lebih lanjut, lihat Ringkasan kumpulan nama XML.

Contoh: Kueri yang tidak tepat pada XML di namespace layanan

Contoh ini menunjukkan pembuatan XML di namespace layanan, dan kueri yang mengembalikan kumpulan hasil kosong.

XElement root = XElement.Parse(
@"<Root xmlns='http://www.adventure-works.com'>
    <Child>1</Child>
    <Child>2</Child>
    <Child>3</Child>
    <AnotherChild>4</AnotherChild>
    <AnotherChild>5</AnotherChild>
    <AnotherChild>6</AnotherChild>
</Root>");
IEnumerable<XElement> c1 =
    from el in root.Elements("Child")
    select el;
Console.WriteLine("Result set follows:");
foreach (XElement el in c1)
    Console.WriteLine((int)el);
Console.WriteLine("End of result set");
Dim root As XElement = _
    <Root xmlns='http://www.adventure-works.com'>
        <Child>1</Child>
        <Child>2</Child>
        <Child>3</Child>
        <AnotherChild>4</AnotherChild>
        <AnotherChild>5</AnotherChild>
        <AnotherChild>6</AnotherChild>
    </Root>
Dim c1 As IEnumerable(Of XElement) = _
        From el In root.<Child> _
        Select el
Console.WriteLine("Result set follows:")
For Each el As XElement In c1
    Console.WriteLine(el.Value)
Next
Console.WriteLine("End of result set")

Contohnya menghasilkan hasil ini:

Result set follows:
End of result set

Contoh: Kueri yang tepat pada XML di namespace layanan

Contoh ini menunjukkan pembuatan XML di namespace layanan, dan kueri yang dikodekan dengan benar.

Solusinya adalah mendeklarasikan dan menginisialisasi XNamespace objek, dan menggunakannya saat menentukan XName objek. Dalam hal ini, argumen untuk Elements metode adalah XName objek.

XElement root = XElement.Parse(
@"<Root xmlns='http://www.adventure-works.com'>
    <Child>1</Child>
    <Child>2</Child>
    <Child>3</Child>
    <AnotherChild>4</AnotherChild>
    <AnotherChild>5</AnotherChild>
    <AnotherChild>6</AnotherChild>
</Root>");
XNamespace aw = "http://www.adventure-works.com";
IEnumerable<XElement> c1 =
    from el in root.Elements(aw + "Child")
    select el;
Console.WriteLine("Result set follows:");
foreach (XElement el in c1)
    Console.WriteLine((int)el);
Console.WriteLine("End of result set");
Imports <xmlns="http://www.adventure-works.com">

Module Module1
    Sub Main()
        Dim root As XElement = _
            <Root xmlns='http://www.adventure-works.com'>
                <Child>1</Child>
                <Child>2</Child>
                <Child>3</Child>
                <AnotherChild>4</AnotherChild>
                <AnotherChild>5</AnotherChild>
                <AnotherChild>6</AnotherChild>
            </Root>
        Dim c1 As IEnumerable(Of XElement) = _
                From el In root.<Child> _
                Select el
        Console.WriteLine("Result set follows:")
        For Each el As XElement In c1
            Console.WriteLine(CInt(el))
        Next
        Console.WriteLine("End of result set")
    End Sub
End Module

Contohnya menghasilkan hasil ini:

Result set follows:
1
2
3
End of result set

Lihat juga