XML десериализация: как получить код объекта вместо элемента? - PullRequest
2 голосов
/ 30 апреля 2020

Я пытаюсь десериализовать файл XML, который является словарем sh с японского на английский, чтобы я мог отобразить информацию в форме Windows. Я до сих пор не слишком осведомлен о том, как XML и десериализация обычно работают, поэтому, пожалуйста, будьте терпеливы, если я ошибаюсь в терминологии.

Мой код десериализует словарь XML очень хорошо, и я могу получить доступ ко всей информации для каждой записи. Однако иногда я хочу получить доступ к некоторой информации, хранящейся в файле XML, в виде кода объекта (?), А не базового элемента (?), И я не знаю, как это сделать.

Вот пример того, что я имею в виду:

В файле XML тег <pos> используется для хранения информации о части речи записи (прилагательное, существительное и т. Д.). Эта информация хранится в списке (из строки) для каждой отдельной записи (поскольку одна запись может записать более одной части речи.) Если бы я просматривал часть речевых данных для отдельной записи, это могло бы выглядеть следующим образом:

    (0) "noun (common) (futsuumeishi)"  
    (1) "noun or participle which takes the aux. verb suru" 
    (2) "nouns which may take the genitive case particle `no'"  

Теперь это многословно, и я не хочу, чтобы вся эта информация отображалась на экране. Я в порядке с сокращенным кодом, используемым в самом файле XML, который будет представлять три вышеуказанных элемента как &n;, &vs; и &adj-no; соответственно. Когда десериализатор сталкивается с этими элементами, он переводит их в подробную форму, описанную в списке атрибутов в верхней части файла, а не в краткую форму, которую я хочу.

XML для одной конкретной записи содержащий эти теги pos выглядит следующим образом:

<entry>
<ent_seq>1371320</ent_seq>
<k_ele>
<keb>水泳</keb>
<ke_pri>ichi1</ke_pri>
<ke_pri>news1</ke_pri>
<ke_pri>nf07</ke_pri>
</k_ele>
<r_ele>
<reb>すいえい</reb>
<re_pri>ichi1</re_pri>
<re_pri>news1</re_pri>
<re_pri>nf07</re_pri>
</r_ele>
<sense>
<!-- These are the tags I'm interested in -->
<pos>&n;</pos>
<pos>&vs;</pos>
<pos>&adj-no;</pos>
<gloss>swimming</gloss>
</sense>
...
...
</entry>

Вот фрагмент списка атрибутов, содержащий данные для тега pos:

<!ENTITY adj-no "nouns which may take the genitive case particle `no'">
...
<!ENTITY n "noun (common) (futsuumeishi)">
...
<!ENTITY vs "noun or participle which takes the aux. verb suru">

Вот объект класса, который Я использую для десериализации элемент sense, который содержит элемент pos:

<Serializable()>
<XmlType("sense")>
Public Class SenseElement
    <XmlElement("pos")>
    Public Property PartOfSpeech As List(Of String)
    <XmlElement("gloss")>
    Public Property Gloss As List(Of GlossElement)

    <XmlElement("stagk")>
    Public Property SenseRestrictedToKeyword As List(Of String)
    <XmlElement("stagr")>
    Public Property SenseRestrictedToReading As List(Of String)

    <XmlElement("xref")>
    Public Property CrossReference As List(Of String)
    <XmlElement("ant")>
    Public Property Antonym As List(Of String)
    <XmlElement("field")>
    Public Property Field As List(Of String)
    <XmlElement("dial")>
    Public Property Dialect As List(Of String)
    <XmlElement("s_inf")>
    Public Property SenseInformation As List(Of String)
    <XmlElement("misc")>
    Public Property Misc As List(Of String)
    <XmlElement("lsource")>
    Public Property LanguageSource As List(Of LanguageSourceElement)
End Class

И, наконец, вот десериализатор:

Sub Deserialise()
    Dim settings As XmlReaderSettings = New XmlReaderSettings
    settings.DtdProcessing = DtdProcessing.Parse

    Dim xmlPath As String = Path.Combine(Application.StartupPath, jmdictpath)

    Dim serialiser As New XmlSerializer(GetType(JMdict))

    Using rdr As Xml.XmlReader = Xml.XmlReader.Create(xmlPath, settings)
        dict = CType(serialiser.Deserialize(rdr), JMdict)
    End Using
End Sub

Итак, вопрос в том, как можно Извлечь краткую форму данных для тега pos, содержащегося в файле XML, а не длинную форму, содержащуюся в списке атрибутов? Есть ли простое решение, чтобы сделать это? Я больше всего предпочел бы ответ на VB. NET, но пока решение объясняется достаточно хорошо, оно не слишком важно.

Также, пожалуйста, не стесняйтесь предлагать правки на этот вопрос, если я неправильно использованная терминология или иным образом неясная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...