xml - 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 = ?
解决方案
使用 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
推荐阅读
- python-3.x - Apxs 命令显示在 Linux 终端中,但不在 Pycharm 终端中
- vb.net-2010 - 条码阅读器如何在后台 vb.Net 中工作
- reactjs - 如何为 popover 组件提供容器?
- openssl - 需要从 EVP_sha256() 中释放 EVP_MD*?
- c++ - 在 Ubuntu 20.04 的 OpenPose 中安装 Boost for CMake
- hyperledger-fabric - 启动 hyperledger caliper 基准测试时出现错误 4
- java - fastxml.jackson ObjectMapper 的 prettyPrint 使用 \r\n 而不是 \n
- flask - EC2 中的烧瓶 [wsgi:error] ImportError: No module named
- android - 为什么 GMSGroundOverlay 图标没有在 GoogleMaps 中填充其边界?
- clojurescript - 在 cljs 中导入时 ajax.edn 不可用