【问题标题】:XML parsing attributesXML解析属性
【发布时间】:2020-04-03 13:23:06
【问题描述】:

我的 XML 文件看起来类似于这种格式:

<?xml version="1.0" encoding="utf-8"?>
  <Document>
     <Fruits>
        <Attr N="Orange" V="23.0" />
        <Attr N="Apple" V="10" />
        <Attr N="Pear" V="0.000000" />
     </Fruits>
     <Customer>
        <Attr N="Package" V="Box" />
        <Attr N="Cashier" V="P26" />
        <Attr N="Type" V="2" />
        <Attr N="Policy" V="25C" />
     </Customer>
     <OrderInfo>
        <Attr N="PartNumber" V="CP231" />
        <Attr N="Qty" V="2" />
        <Attr N="Salesman" V="Joe" />
     </OrderInfo>
     <OrderInfo>
        <Attr N="PartNumber" V="CD131" />
        <Attr N="Qty" V="3" />
        <Attr N="Salesman" V="Joe" />
     </OrderInfo>
  </Document>

我正在尝试从 OrderInfo 中提取 N 和 V 的 PartNumber 和 Qty,但由于某种原因我的代码无法正常工作,这是我的代码,如果我能得到任何帮助,将不胜感激。

 Dim xmlSource As New XmlTextReader("Test.xml")
    Dim xml = XDocument.Load(xmlSource)
    Dim trs = xml.Root.Descendants("OrderInfo").ToList()
    For Each CalculatedPrice In trs
        Dim tds = CalculatedPrice.Descendants("Attr")
        For Each Attr As XElement In tds
            Dim atr As XAttribute = Attr.Attribute("N")
            If Not (atr.Value = Nothing) Then
                Console.WriteLine(String.Format("{0}", atr.Value))

            End If
        Next
    Next

【问题讨论】:

  • 你能澄清一下“我的代码永远不会工作”的意思吗?我刚刚运行了您的确切代码,它打印出“PartNumber Qty Salesman PartNumber Qty Salesman”
  • 您应该添加您得到的输出或您遇到的任何错误消息。这将有助于其他贡献者快速找到问题。
  • 欢迎来到 SO。只是一个想法,但 XML 看起来有点不常见,元素名为“属性”,属性名为“名称”和“值”(N 和 V)。属性本身就是 name='value'。
  • 我建议使用 XmlDocument 和 SelectNodes,最后在结果上调用 GetAttribute()。
  • @William Walseth:这是一个糟糕的建议。 xml linq 在解析这个 xml 方面要好得多。

标签: xml vb.net linq


【解决方案1】:

见下面的代码:

Imports System.Xml
Imports System.Xml.Linq
Module Module1
    Const FILENAME As String = "c:\temp\test.xml"
    Sub Main()
        Dim xml = XDocument.Load(FILENAME)
        Dim trs As List(Of XElement) = xml.Root.Descendants("OrderInfo").ToList()
        For Each CalculatedPrice As XElement In trs
            Dim tds As List(Of XElement) = CalculatedPrice.Descendants("Attr").ToList()
            For Each Attr As XElement In tds
                Dim atr As XAttribute = Attr.Attribute("N")
                If Not (atr.Value = Nothing) Then
                    Console.WriteLine("Name : '{0}', Value : '{1}'", atr.Name.LocalName, CType(atr, String))

                End If
            Next
        Next
    End Sub

End Module

【讨论】:

    【解决方案2】:

    这是一个工作示例。

        Imports System.Xml
    
        Module Module1
                Const FILENAME As String = "c:\temp\test.xml"
    
                Sub Main()
                        Dim xml As XmlDocument = New XmlDocument()
                        xml.Load(FILENAME)
    ' Original, Attributes of OrderInfo
    
                        For Each ndRow As XmlElement In xml.SelectNodes("//OrderInfo/Attr")
                                Console.WriteLine(ndRow.GetAttribute("N") + ":" + ndRow.GetAttribute("V"))
                        Next
    
    ' All attributes for Fruit and OrderInfo
                    For Each ndRow As XmlAttribute In xml.SelectNodes("//Attr/@*")
                            Console.WriteLine(ndRow.Value)
                    Next
    
                    ' All attributes for just Fruit
                    For Each ndRow As XmlAttribute In xml.SelectNodes("//*[not(OrderInfo)]/Attr/@*")
                            Console.WriteLine(ndRow.Value)
                    Next
    
                End Sub
    
        End Modul
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 2010-11-02
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多