尝试从xml字符串中获取xml节点值时,序列不包含任何元素

时间:2018-06-20 17:37:33

标签: c# xml-parsing

请阅读下面的代码。在这里,我尝试获取<GetSellerListResponse>节点下的所有元素,然后我的目标是获取TotalNumberOfPages值(当前为9,在XML中可以看到)。

但是我的问题是我遇到了错误:

  

System.InvalidOperationException:'序列不包含任何元素'

为更好地理解,随附了错误屏幕截图。您能告诉我我试图抓住所有要素的方式出了什么问题吗?另外,如果可以的话,您能告诉我如何从TotalNumberOfPage那里抢到那9吗?

预先感谢

C#:

var parsedXML = XElement.Parse(xml);
var AllElements = parsedXML.Descendants("GetSellerListResponse")
                           .Where(x => x.Attribute("xmlns").Value.Equals("urn:ebay:apis:eBLBaseComponents"))
                           .First();

XML:

<?xml version="1.0" encoding="UTF-8"?>
<GetSellerListResponse xmlns="urn:ebay:apis:eBLBaseComponents">
    <Timestamp>2018-06-20T17:26:29.518Z</Timestamp>
    <Ack>Success</Ack>
    <Version>1059</Version>
    <Build>E1059_CORE_APISELLING_18694654_R1</Build>
    <PaginationResult>
    <TotalNumberOfPages>9</TotalNumberOfPages>
    </PaginationResult>
</GetSellerListResponse>

Error pic

2 个答案:

答案 0 :(得分:2)

编辑:您的错误是XElement的用法:它正在<GetSellerListResponse>的子级中搜索匹配的元素;这就是为什么您没有得到任何结果的原因。将XElement.Parse(xml);更改为XDocument.Parse(xml);,然后以下代码段将起作用。

您可以简单地检查本地名称:

var AllElements = parsedXML.Descendants().First(x => x.Name.LocalName == "GetSellerListResponse");

我建议对XDocument使用XElement而不是parsedXML,因为您可以将上述查询缩短为var AllElements = parsedXML.Root;

您可以尝试的另一种方法是在名称空间前添加

XNamespace ns = "urn:ebay:apis:eBLBaseComponents";
var AllElements = parsedXML.Descendants(ns + "GetSellerListResponse").First();

回答“如何获取页数”问题:

var pages = AllElements.Element(ns + "PaginationResult").Element(ns + "TotalNumberOfPages").Value;

答案 1 :(得分:1)

我建议使用XmlDocument中的System.Xml类。

尝试以下代码:

XmlDocument doc = new XmlDocument();
doc.LoadXml("<GetSellerListResponse xmlns=\"urn:ebay:apis:eBLBaseComponents\"><Timestamp>2018-06-20T17: 26:29.518Z</Timestamp><Ack>Success</Ack><Version>1059</Version><Build>E1059_CORE_APISELLING_18694654_R1</Build><PaginationResult><TotalNumberOfPages>9</TotalNumberOfPages></PaginationResult></GetSellerListResponse>");
XmlNodeList nodeList = doc.GetElementsByTagName("TotalNumberOfPages");

在这种情况下,您的nodeList仅包含TotalNumberOfPages的一个元素,您可以通过选中

访问该值
nodeList.FirstOrDefault().InnerText