首页 > 解决方案 > VB.NET通过属性文本反序列化XML子节点

问题描述

尝试反序列化 XML 文件但遇到子节点问题。我需要通过那里的 ID 值来收集这些,例如 ConNum、class、recid。目前我可以取回一个值,但它给了我 ID 的名称而不是值。例如:xData.TRAN_DATEX.theTarget = ConNum 我需要 20190910 代替。

这是 XML:

<?xml version="1.0" encoding="UTF-8"?>
  <targets>
    <target id="ConNum">20190910</target>
    <target id="class">Third</target>
    <target id="recid">123 </target>
  </targets>

这是我的课:

Imports System.Xml.Serialization

<Serializable, XmlRoot("targets")>
Public Class XmlFile
    <XmlElement("target")> Public Property TRAN_DATEX As myTarget
End Class

<Serializable, XmlRoot("target")>
Public Class myTarget
    <XmlAttribute("id")> Public theTarget As String

End Class

这是反序列化方法:

Dim fFile As FileInfo = New FileInfo("C:\Temp\TARGETS.metadata")
Dim s As New XmlSerializer(GetType(XmlFile))
Using sr As New StreamReader(fFile.FullName)
    xData = s.Deserialize(sr)
    Stop
End Using

标签: vb.netxml-deserialization

解决方案


theTarget正在获取id属性的值。你想要XmlText那个元素的:

<Serializable, XmlRoot("target")>
Public Class myTarget
    <XmlAttribute("id")> Public theTarget As String
    <XmlText> Public Property theValue As String
End Class

然后,xData.TRAN_DATEX.theTarget您可以使用xData.TRAN_DATEX.theValue


编辑:回应评论。

由于有多个<target>元素,TRAN_DATEX因此需要一个列表:

<Serializable, XmlRoot("targets")>
Public Class XmlFile
    <XmlElement("target")> Public Property TRAN_DATEX As New List(Of myTarget)
End Class

LINQ 可用于访问所需的数据:

Dim reqValueTarget = xData.TRAN_DATEX.FirstOrDefault(Function(x) x.theTarget = "ConNum")
If reqValueTarget IsNot Nothing then
    Dim reqValue = reqValueTarget.theValue
End If

推荐阅读