2014-06-11 157 views
0

我的XML获取嵌套元素的LINQ to XML

<?xml version="1.0" encoding="utf-8"?> 
<metadata created="2014-05-15T12:26:07.701Z" xmlns="http://site/cu-2.0#" xmlns:ext="http://site/cu/b-2.0"> 
    <customer-list count="47" offset="0"> 
    <customer id="7123456" type="Cust" ext:mark="1"> 
     <name>Tony Watt</name> 
     <sort-name>Watt, Tony</sort-name> 
     <gender>male</gender> 
     <country>US</country> 
     <knownAs-list> 
     <knownAs locale="ko" sort-name="Tony Watt"</knownAs> 
     <knownAs locale="ja" sort-name="Watt Tony"</knownAs> 
     </knownAs-list> 
     <tag-list> 
      <begin>Country</begin> 
      <tag count="1"> 
      <name>usa</name> 
     </tag-list> 
</customer> 
    <customer id="9876543" type="Cust" ext:mark="2"> 
.... 
</customer-list> 

所以我有一些代码,获取的所有数据。我进了一步使用匿名类型和添加的值成一个类,如下

Dim c = From cust As XElement In XDoc.Descendants(ns + "customer") 
       Select New Customer() With {.Name = cust.Element(ns + "name"), 
             .Surname = CStr(cust.Element(ns + "surname")), 
             .Id = cust.Attribute("id"), 
             .Tag = CStr(cust.Element("tag-list").Element("begin"))} 

以上代码从XML返回数据,但添加这行代码

.Tag = CStr(cust.Element("tag-list").Element("begin")) 

抛出异常, “你调用的对象是空的”。现在那里有此两种可能性

  1. 我有我的代码错误的特定行(从“标记列表”元素检索“开始”)
  2. 我知道有些标签列表元素没有一个嵌套开始因此可能会增加一些混淆。我补充Cstr来克服这一点,但不知道这是否足够?

阅读MSDN似乎使用.Descendants(Xdoc.Descendants)将得到其中的元素将返回数据高达我已经指出了路径中的所有元素中的所有数据,所以据我可以告诉数据“后应该与上面的代码一起提供。任何人都可以帮助我从标签列表中获取开始数据吗?

+0

您确定标签元素有效吗?我看不到结束标记 – dotnetom

+0

对不起,我注意到我没有正确添加/格式化XML,我现在已经改变了 – Computer

+0

你可能想考虑使用XPath:http://stackoverflow.com/questions/3642829/ how-to-use-xpath-with-xelement-or-linq – Neolisk

回答

1

缺少XML名称空间声明。使用

.Tag = CStr(cust.Element(ns + "tag-list").Element(ns + "begin")) 
+0

谢谢 - 这是做的伎俩! – Computer