【问题标题】:Linq to XML using descendant to get valuesLinq to XML 使用后代获取值
【发布时间】:2018-01-30 10:20:09
【问题描述】:

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

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

【问题讨论】:

  • 这是vb,而不是c#。请不要添加与您的问题无关的标签。
  • 是的,我知道,但我同时使用 C# 和 VB .Net,虽然语法有相似之处,但我确信如果 C# 代码作为答案发布,我可以轻松地将其转换为 VB.Net

标签: xml vb.net linq-to-xml


【解决方案1】:

需要注意的重要一点是,您的 XML 在根元素处声明了 default namespace,其 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

dotnetfiddle demo

【讨论】:

  • 是的。还有一点,我设法通过使用 Dim ns As XNamespace = xe.GetDefaultNamespace 来获取命名空间而无需将其编码为字符串,希望这应该可以使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多