使用子体获取值的Linq到XML

使用子体获取值的Linq到XML,xml,vb.net,linq-to-xml,Xml,Vb.net,Linq To Xml,示例XML: <?xml version="1.0" encoding="utf-8"?> <customers xmlns="http://example.com/ns/" si="0" records="2"> <customer id="123456789"> <dob>2017-12-10T16:22:27.033Z</dob> <location> <number>444

示例XML:

<?xml version="1.0" encoding="utf-8"?>
<customers xmlns="http://example.com/ns/" si="0" records="2">
  <customer id="123456789">
    <dob>2017-12-10T16:22:27.033Z</dob>
    <location>
      <number>444555666777</number>
    </location>
    <link rel="self" href="http://example.com" />
  </customer>
  <customer id="987654321">
    <dob>2017-12-11T17:00:00.033Z</dob>
    <location>
      <number>555666999888</number>
    </location>
    <link rel="self" href="http://example.com" />
  </customer>
  <link rel="self" href="http://example.com" />
</customers>
目标是获取所有的数值(在location下),但我想再进一步,看看是否可以在一行中获取该元素,而不是在每个循环中都有一个值(不确定这是否可行?)。所以我把代码改成

Dim xd As XDocument = XDocument.Load("C:\XMLFile1.xml")
Dim xe As XElement = Xd.Root
Dim nums As IEnumerable(Of XElement) = xe.Descendants.Where(Function(x) x.Element("number").Value)
'Dim nums As IEnumerable(Of XElement) = xe.Descendants.Where(Function(x) x.Element("location").Element("number").Value)
这返回为null/nothing。我尝试过不同的变体,将元素与子元素混合,并添加多个选择,但我认为我需要一个工作示例来真正了解发生了什么以及我在哪里犯了错误。看到网上的例子并没有真正起到帮助作用,因为我想我最终把自己弄糊涂了


我读了几篇文章,但有一些文章指向添加名称空间,但我真的不想走这条路,直到我了解到底发生了什么,以及我是否真的需要它?

需要注意的是,您的XML在根元素处声明了,URI是
”http://example.com/ns/“
。根据默认名称空间的定义,根元素以及XML中所有没有前缀的子元素都属于此名称空间,因此我们需要使用
XNamespace
结合元素的本地名称来正确引用名称空间中的元素:

Dim ns As XNamespace = "http://example.com/ns/"
Dim numbers As IEnumerable(Of XElement) = xe.Descendants(ns+"number")
For Each number As XElement In numbers
    Console.WriteLine(number.Value)
Next

这是
vb
,而不是
c
。请不要添加与您的问题无关的标记。是的,我知道,但我同时添加C#和VB.Net。虽然在语法上有相似之处,但我确信如果C#代码作为答案发布,我可以轻松地将其转换为VB.Net。还有一点,我通过使用Dim ns作为XNamespace=xe.GetDefaultNamespace,在不将名称空间编码为字符串的情况下获得了名称空间,希望这可以很好地使用。
Dim ns As XNamespace = "http://example.com/ns/"
Dim numbers As IEnumerable(Of XElement) = xe.Descendants(ns+"number")
For Each number As XElement In numbers
    Console.WriteLine(number.Value)
Next