VB.NET десериализует подузлы XML по тексту атрибута - PullRequest
1 голос
/ 10 октября 2019

Попытка десериализации файла XML, но возникли проблемы с подузлами. Мне нужно собрать их по значению идентификатора, например, ConNum, class, recid. В настоящее время я могу вернуть одно значение, но оно дает мне имя идентификатора, а не значение. Например: 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

1 Ответ

0 голосов
/ 10 октября 2019

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