首页 > 解决方案 > XML节点读取

问题描述

我有一个 xml 文件,如下所示;

<ZPPORDER01>
  <IDOC BEGIN="1">
    <EDI_DC40 SEGMENT="1">
      <TABNAM>EDI_DC40</TABNAM>
      <MANDT>100</MANDT>
      <DOCNUM>0000000000000001</DOCNUM>
    </EDI_DC40>
    <Z1PPORDITEM SEGMENT="1">
      <AUFNR>000000000123</AUFNR>
      <POSNR>0001</POSNR>
      <Z1PPORDOPER SEGMENT="1">
        <VORNR>0010</VORNR>
        <ARBPL>PIGME</ARBPL>
        <Z1PPORDCOMP SEGMENT="1">
          <POSNR>0100</POSNR>
          <CPARAM>RV ;</CPARAM>
        </Z1PPORDCOMP>
        <Z1PPORDCOMP SEGMENT="1">
          <POSNR>0200</POSNR>
          <CPARAM>PLT;</CPARAM>
        </Z1PPORDCOMP>
     </Z1PPORDOPER>
    </Z1PPORDITEM>
  </IDOC>
</ZPPORDER01>

我想为每个<Z1PPORDCOMP SEGMENT="1">节点读取 PosNR 和 CPARAM。正如所见,有多个节点具有相同的节点名称(Z1PPORDCOMP SEGMENT="1" 和相同的子名称(POSNR,CPARAM)。

我想阅读所有孩子的内部文本并在扫描中分配给 4 个不同的字符串。

我写了一个脚本...我定义了 4 个字符串来读取每个孩子的数据。我可以从前两个值中读取值,但我不知道如何从下一个子值中获取数据。

我已经搜索过使用了 Xml.XPath,但我不知道在这种情况下如何使用它。


dim doc as System.Xml.XmlDocument;
dim node as System.Xml.XmlNode;
doc = new System.Xml.XmlDocument;
doc.Load("\\mypc\ShareOn\INPUT\Test.xml");

dim PosNR0100 as string ;
dim PosNR0100_CPARAM as string ;
dim PosNR0200 as string ;
dimPosNR0200_CPARAM as string ;

PosNR0100       = doc.SelectSingleNode("/ZPPORDER01/IDOC [@BEGIN='1']/Z1PPORDITEM [@SEGMENT='1']/Z1PPORDOPER [@SEGMENT='1']/Z1PPORDCOMP [@SEGMENT='1']/POSNR").InnerText;

PosNR0100_CPARAM    = doc.SelectSingleNode("/ZPPORDER01/IDOC [@BEGIN='1']/Z1PPORDITEM [@SEGMENT='1']/Z1PPORDOPER [@SEGMENT='1']/Z1PPORDCOMP [@SEGMENT='1']/CPARAM").InnerText;
PosNR0200       = ?
PosNR0200_CPARAM    = ?

标签: xmlvb.net

解决方案


使用 XML 序列化

创建类来表示您的数据

Imports System.Xml.Serialization
Imports System.IO
Public Class ZPPORDER01
    Public Property IDOC As IDOC
End Class
Public Class IDOC
    Public Property EDI_DC40 As EDI_DC40
    Public Property Z1PPORDITEM As Z1PPORDITEM
End Class

Public Class EDI_DC40
    Public Property TABNAM As String
    Public Property MANDT As String
    Public Property DOCNUM As String
End Class
Public Class Z1PPORDITEM
    <XmlAttribute>
    Public Property SEGMENT As Integer
    Public Property AUFNR As String
    Public Property POSNR As String
    Public Property Z1PPORDOPER As Z1PPORDOPER
End Class
Public Class Z1PPORDOPER
    <XmlAttribute>
    Public Property SEGMENT As Integer
    Public Property VORNR As String
    Public Property ARBPL As String
    <XmlElement("Z1PPORDCOMP")>
    Public Property Z1PPORDCOMPs As List(Of Z1PPORDCOMP)
End Class
Public Class Z1PPORDCOMP
    <XmlAttribute>
    Public Property SEGMENT As Integer
    Public Property POSNR As String
    Public Property CPARAM As String
End Class

然后反序列化

Dim s As New XmlSerializer(GetType(ZPPORDER01))
Dim z As ZPPORDER01
Using sr As New StreamReader("filename.xml")
    z = DirectCast(s.Deserialize(sr), ZPPORDER01)
End Using
For Each comp In z.IDOC.Z1PPORDITEM.Z1PPORDOPER.Z1PPORDCOMPs
    MessageBox.Show($"POSNR: {comp.POSNR}, CPARAM: {comp.CPARAM}")
Next

推荐阅读