VB.NET 按属性文本反序列化 XML 个子节点

VB.NET Deserialize XML sub nodes by attribute text

正在尝试反序列化 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>

这是我的 class:

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

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.theValue

而不是 xData.TRAN_DATEX.theTarget

编辑: 回复评论。

由于有多个 <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