请阅读下面的代码。在这里,我尝试获取<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>
答案 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