gpt4 book ai didi

c# - Linq to Xml - 如何选择具有特定 XNameSpace 的特定 XAttribute 的 XElement

转载 作者:行者123 更新时间:2023-11-30 18:01:37 25 4
gpt4 key购买 nike

我有以下用于测试网络服务的简单代码:

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,但为什么呢?

通过删除“where”很容易得到所有的 dc:title 元素,所以这就是问题所在。

我不是 Linq-to-Xml 大师,但这个带有属性的命名空间业务确实令人困惑。

最佳答案

这是因为 Descendants() 返回了 2 个 dc:title 元素。一个带有 xsi:type 属性,一个没有。当您在没有 where 的地方调用 .Value 时,它会给您一个空引用异常。在检查值之前,您需要检查属性是否为 null。

下面是一些有效的代码:

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

关于c# - Linq to Xml - 如何选择具有特定 XNameSpace 的特定 XAttribute 的 XElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8942431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com