Linq to Xml - как выбрать XElement с определенным XAttribute с определенным XNameSpace - PullRequest
3 голосов
/ 20 января 2012

У меня есть следующий простой код для тестирования веб-службы:

using System;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
using System.Collections.Generic;

namespace Testing_xmlReturn
{
    class MainClass
    {
        public static void Main (string[] args)
        {   
        // Default namespaces
        XNamespace df = @"http://oss.dbc.dk/ns/opensearch";
        XNamespace dkdcplus = @"http://biblstandard.dk/abm/namespace/dkdcplus/";
        XNamespace ac = @"http://biblstandard.dk/ac/namespace/";
        XNamespace dcterms = @"http://purl.org/dc/terms/";
        XNamespace dkabm = @"http://biblstandard.dk/abm/namespace/dkabm/";
        XNamespace dc = @"http://purl.org/dc/elements/1.1/";
        XNamespace oss = @"http://oss.dbc.dk/ns/osstypes";
        XNamespace xsi = @"http://www.w3.org/2001/XMLSchema-instance";

        XDocument xd = new XDocument();
        xd = XDocument.Load(@"http://opensearch.addi.dk/next_2.0/?action=search&query=mad&stepValue=1&sort=date_descending&outputType=xml");


        var q = from result in xd.Descendants(dkabm + "record").Elements(dc + "title")
            where result.Attribute(xsi + "type").Value == "dkdcplus:full"
            select result;

        foreach(XElement xe in q)
                Console.WriteLine("Name: " + xe.Name +" Value: " + xe.Value);

        Console.ReadLine();

        }
    }
}

XElement, который мне нужно получить из ответа:

<dc:title xsi:type="dkdcplus:full">Dynastiet præsenterer D-Dag!</dc:title>

Я продолжаю получать исключение System.NullReferenceException,Очевидно, я не получаю XElement, но почему?

Легко вытащить все элементы dc: title, удалив «где», чтобы это стало проблемой.

Янет мастера Linq-to-Xml, но этот бизнес пространства имен с атрибутами действительно сбивает с толку.

1 Ответ

1 голос
/ 20 января 2012

Это потому что есть 2 dc:title элементов, возвращаемых Descendants(). Один с атрибутом xsi:type и один без. Когда вы звоните .Value на номер без в вашем where, это дает вам исключение нулевой ссылки. Прежде чем проверять значение, необходимо проверить, что атрибут имеет нулевое значение.

Вот код, который работает:

var q = from result in xd.Descendants(dc + "title")
    where (String)result.Attribute(xsi + "type")  == "dkdcplus:full"
    select result;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...