Linq to XML使用后代获取值

时间:2018-01-30 10:20:10

标签: 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>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>

我设法使用

查询文件
Dim X As XElement = Xelement.Load("C:\XMLFile1.xml")
Dim Customers As IEnumerable(Of XElement) = Xelement.Elements()

' Read the entire XML
For Each c In Customers
    Console.WriteLine(c)
Next

目标是获取所有数值(在位置下),但我想更进一步,看看我是否可以在一行中得到这个元素,而不是每个循环都有一个(不确定这是否可能在所有?)。所以我将代码更改为

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。我尝试了不同的变化,混合元素与后代和添加多个选择,但我想我需要一个工作的例子来真正了解发生了什么以及我犯了什么错误。看到网上的例子并没有真正帮助,因为我认为我最终让自己感到困惑。

我读了一些文章,但有些人指的是添加一个命名空间,但我真的不想走下那条大道,直到我明白了什么,如果我真的需要它?

1 个答案:

答案 0 :(得分:2)

需要注意的重要一点是,您的XML在根元素处声明了default namespace,其URI是"http://example.com/ns/"。根据默认命名空间的定义,根元素以及XML中没有前缀的所有后代元素都属于此命名空间,因此我们需要使用XNamespace结合元素的local-name来正确引用命名空间中的元素:

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

<强> dotnetfiddle demo