【问题标题】:Get XML data with random Id nodes获取具有随机 Id 节点的 XML 数据
【发布时间】:2017-03-22 12:56:48
【问题描述】:

我想读取我的 XML 的特定节点,但我在如何集中问题上遇到问题。

目前 XML 文件具有以下结构:

<?xml version="1.0" encoding="utf-8"?>
<Assessment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:xsd="http://www.w3.org/2001/XMLSchema"   xmlns="http://www1.macadam.eu/Webservices/FleetCarV3/">
 <Damages>
 <Damage>
  <Id>15724669</Id>
  <AssessmentId>1959065</AssessmentId>
  <Location>
   <Id>5</Id>
    <DescriptionEN>Panel R R</DescriptionEN>
    <DescriptionNL>Panneel A R</DescriptionNL>
    <DescriptionFR>Panneau ARD</DescriptionFR>
    <DescriptionDE>Panel HR</DescriptionDE>
    <DescriptionES>Panel TRAS DR</DescriptionES>
  </Location>
  <Type>
    <Id>1274</Id>
    <DescriptionEN>Bump(s)</DescriptionEN>
    <DescriptionNL>Deuk(en)</DescriptionNL>
    <DescriptionFR>Bosse(s)</DescriptionFR>
    <DescriptionDE>Dell(en)</DescriptionDE>
    <DescriptionES>Abolladuras</DescriptionES>
  </Type>
  <Repair>
    <Id>1307</Id>
    <DescriptionEN>Le - Replace and paint</DescriptionEN>
    <DescriptionNL>Le - Vervangen en spuiten</DescriptionNL>
    <DescriptionFR>Le - Remplacer et peindre</DescriptionFR>
    <DescriptionDE>Erneuern + lackieren</DescriptionDE>
    <DescriptionES>Le - Reemplazar Y Pintar</DescriptionES>
  </Repair>
  <Comment />
 </Damage>
 <Damage>
   ...
   ...
 </Damage>
 <Damage>
   ...
   ...
 </Damage>
 </Damages>
</Assessment>

请注意,我放置了更多&lt;Damage&gt; 标签。每个&lt;Id&gt; 每个&lt;Damage&gt; 节点都不同,我需要的是&lt;DescriptionES&gt; 节点内的文本。

以下是尝试获取&lt;Location&gt; 节点的代码:

nsmgr = New XmlNamespaceManager(m_xmld.NameTable)
nsmgr.AddNamespace("sd", "http://www1.macadam.eu/Webservices/FleetCarV3/")

m_nodelist = m_xmld.DocumentElement.SelectNodes("/sd:Assessment/sd:Damages/sd:Damage/sd:Location", nsmgr)
For Each m_node In m_nodelist
    For j = 0 To 5000
        Dim Location = m_node.SelectSingleNode("/sd:Assessment/sd:Damages/sd:Damage/sd:Location[sd:Id=" & j & "]", nsmgr).InnerText
        If Location IsNot Nothing Then
            MsgBox("i'm in")
            'txtDamageReport.Text = Location
        End If
    Next j
Next

正如预期的那样,它不起作用。我不知道如何继续。

【问题讨论】:

  • 您的代码似乎没有针对特定节点。你想得到所有伤害的所有位置吗?
  • @chateaur 这是一个测试,看看我是否可以访问 。我需要所有的

标签: xml vb.net xml-parsing


【解决方案1】:

您可以使用 LINQ to XML,其 API 易于理解且可读性更好

Dim document As XDocument = XDocument.Load(pathToTheFile)
Dim ns = XNamespace.Get("http://www1.macadam.eu/Webservices/FleetCarV3/")

For Each damage As XElement in document.Descendants(ns + "Damage")
    Dim damageId = damage.Element(ns + "Id").Value
    Dim locationDescription = damage.Element(ns + "Location").
                                     Element(ns + "DescriptionES").
                                     Value

    MessageBox.Show($"Id = {damageId};  Desc = {locationDescription}")
Next

vb.net 有可能使用XML Axis Properties,如果您有 xml 文件的架构,这可能很有用,那么您将获得对元素名称的 IntelliSense 支持。
使用 Axis 属性与上面的代码相同。
要在命名空间中使用轴属性,您需要将命名空间导入文件

Imports <xmlns:ns="http://www1.macadam.eu/Webservices/FleetCarV3/">  

For Each damage As XElement in document...<ns:Damage>
    Dim damageId = damage.<ns:Id>.Value
    Dim locationDescription = damage.<ns:Location>.<ns:DescriptionES>.Value

    MessageBox.Show($"Id = {damageId};  Desc = {locationDescription}")
Next

【讨论】:

  • 感谢您的回答。我正在使用您的代码,但它没有显示任何弹出窗口(都已尝试过)。看起来非常清晰和合乎逻辑的代码,但没有显示数据。有点奇怪。
  • 你也需要证明一个命名空间,检查我更新的答案
  • 哇,它现在就像一个魅力。非常感谢您的解决方案以及 LINQ 和 Xml 属性的微型教程。当然,我将来会使用它。
【解决方案2】:

您可以按如下方式使用 VB XmlDocument。我相信 XmlNamespaceManager 在您的代码中是错误的,但由于您没有提供它...

这对我有用:

Dim doc As New XmlDocument

doc.Load(path)

//Add a namespace to all the document
Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(doc.NameTable)
        nsmgr.AddNamespace("g", "http://www1.macadam.eu/Webservices/FleetCarV3/")

Dim nodeList As XmlNodeList
Dim root As XmlElement = doc.DocumentElement
nodeList = root.SelectNodes("//g:Assessment//g:Damages//g:Damage//g:Location", nsmgr)

// Loop over damage section
For Each damageNode As XmlNode In nodeList
     Dim id As String = damageNode.SelectSingleNode("//g:Id", nsmgr).InnerText
     Dim desc As String = damageNode.SelectSingleNode("//g:DescriptionES", nsmgr).InnerText

      MsgBox(id & vbCrLf & desc)
Next

【讨论】:

  • 添加了命名空间!就我而言,您的代码获取数据但与 部分不同。问题是这是一个大约 3k 行的 XML,所以我想它在获取数据时遇到了一些麻烦。也许显示完整的 XML 内容是个好主意。
猜你喜欢
  • 2019-01-03
  • 1970-01-01
  • 2020-06-16
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多