嘿伙计们我试图从我的xdocument中的更深层容器中获取一些值,但我总是在Nullreference中运行。
到目前为止,这是我的代码:
original <- list(list(1:3, 4:6), list(2:4, 5:7))
> final
[[1]]
[[1]][[1]]
1, 2, 3
[[1]][[2]]
2, 3, 4
[[2]]
[[2]][[1]]
4, 5, 6
[[2]]
[[2]][[2]]
5, 6, 7
这是我想要使用的XML:
StreamReader xmlStream = new StreamReader(rsp.GetResponseStream());
string XMLstr = xmlStream.ReadToEnd();
XDocument xelement = XDocument.Parse(XMLstr);
xmlStream.Close();
IEnumerable<XElement> items = xelement.Elements();
foreach (var item in items )
{
Console.WriteLine(item.Element("ItemID").Value.ToString());
}
任何人都可以解释我错过的内容吗?
由于
答案 0 :(得分:1)
您在Elements()
上呼叫XDocument
,以便 返回根元素。
然后你在那个根元素上调用Element("ItemID")
- 要求一个不存在的元素。这将返回null
,导致您的例外。此外,您忽略了所有元素都在命名空间中的事实。
看起来你可能真的想要Item
元素,所以你可以使用:
// Changed the variable name to match what it is...
XDocument doc = XDocument.Parse(XMLstr);
XNamespace ns = "urn:ebay:apis:eBLBaseComponents";
Enumerable<XElement> items = doc.Descendants(ns + "Item");
foreach (var item in items)
{
// XElement.Value is already a string; no need to call ToString on it
Console.WriteLine(item.Element(ns + "ItemID").Value);
}
另一种方法是专门找到ItemArray
元素及其Item
个孩子:
XDocument doc = XDocument.Parse(XMLstr);
XNamespace ns = "urn:ebay:apis:eBLBaseComponents";
Enumerable<XElement> items = doc.Root
.Element(ns + "ItemArray")
.Elements(ns + "Item");
// Code as before
答案 1 :(得分:0)
找到这个的任何VB用户。首先要注意的是,有一个命名空间,因此考虑到这一点的最简单方法之一就是添加一个Imports语句。
Imports <xmlns="urn:ebay:apis:eBLBaseComponents">
接下来解析响应。
Dim someXE As XElement = XElement.Parse(XMLstr)
然后选择所有ItemID,无论它们位于何处
Dim itemID As IEnumerable(Of XElement) = someXE...<ItemID>
最后单独看一下
For Each id As XElement In itemID
Debug.WriteLine(id.Value) 'from example above 110043597553
Next