XML文档到IEnumerable <xelement>并获取值

时间:2016-07-21 19:31:08

标签: xml linq xelement

嘿伙计们我试图从我的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());
            }

任何人都可以解释我错过的内容吗?

由于

2 个答案:

答案 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