是否有最佳实践来解析一个父XML节点中包含的所有信息?

问题描述 投票:1回答:1

我正在编写一个VB.NET应用程序来解析一个大的XML文件,该文件是日语字典。我对XML解析是完全陌生的,我真的不知道我在做什么。整个字典适合两个XML标签<jmdict></jmdict>之间。下一级是<entry>,其中包含100万个条目的所有信息,包括形式,发音,单词的含义等。

一个典型的条目可能看起来像这样:

<entry>
<ent_seq>1486440</ent_seq>
<k_ele>
<keb>美術</keb>
<ke_pri>ichi1</ke_pri>
<ke_pri>news1</ke_pri>
<ke_pri>nf02</ke_pri>
</k_ele>
<r_ele>
<reb>びじゅつ</reb>
<re_pri>ichi1</re_pri>
<re_pri>news1</re_pri>
<re_pri>nf02</re_pri>
</r_ele>
<sense>
<pos>&n;</pos>
<pos>&adj-no;</pos>
<gloss>art</gloss>
<gloss>fine arts</gloss>
</sense>
<sense>
<gloss xml:lang="dut">kunst</gloss>
<gloss xml:lang="dut">schone kunsten</gloss>
</sense>
<sense>
<gloss xml:lang="fre">art</gloss>
<gloss xml:lang="fre">beaux-arts</gloss>
</sense>
<sense>
<gloss xml:lang="ger">Kunst</gloss>
<gloss xml:lang="ger">die schönen Künste</gloss>
<gloss xml:lang="ger">bildende Kunst</gloss>
</sense>
<sense>
<gloss xml:lang="ger">Produktionsdesign</gloss>
<gloss xml:lang="ger">Szenographie</gloss>
</sense>
<sense>
<gloss xml:lang="hun">művészet</gloss>
<gloss xml:lang="hun">művészeti</gloss>
<gloss xml:lang="hun">művészi</gloss>
<gloss xml:lang="hun">rajzóra</gloss>
<gloss xml:lang="hun">szépművészet</gloss>
</sense>
<sense>
<gloss xml:lang="rus">изящные искусства; искусство</gloss>
<gloss xml:lang="rus">{~{的}} художественный, артистический</gloss>
</sense>
<sense>
<gloss xml:lang="slv">umetnost</gloss>
<gloss xml:lang="slv">likovna umetnost</gloss>
</sense>
<sense>
<gloss xml:lang="spa">bellas artes</gloss>
</sense>
</entry>

我有一个类对象Entry,该对象用于存储包含在上述条目中的所有信息。我知道所有标签的含义,从语义上解释数据没有问题,我只是不确定要使用什么工具来实际解析所有这些信息。

例如,如何在开始时提取<ent_seq>标记的内容?并且,即使从父标记中包含的信息,也从XML标签提取信息的方法是否与<keb>标签中包含的<ke_pri><k_ele>标签中的信息相同?还是应该使用其他方法?

我知道这听起来像是作业的帮助-我并不是在要求别人提供完整的解决方案并构建解析器。我只是不知道从哪里开始以及要使用什么工具。我非常感谢您提供有关开始解析XML文件所需的方法的一些指导,然后一旦知道自己在做什么,便会自行构建解决方案。

-

编辑

因此,我从this website中遇到了这段代码,该代码使用XMLReader一次遍历一个节点:

Dim readXML As XmlReader = XmlReader.Create(New StringReader(xmlNode))
While readXML.Read()
    Select Case readXML.NodeType
        Case XmlNodeType.Element
            ListBox1.Items.Add("<" + readXML.Name & ">")
            Exit Select
        Case XmlNodeType.Text
            ListBox1.Items.Add(readXML.Value)
            Exit Select
        Case XmlNodeType.EndElement
            ListBox1.Items.Add("")
            Exit Select
    End Select
End While

但是第一行出现错误

'XmlNode'是一个类类型,不能用作表达式

我不确定如何解决此错误-有什么想法吗?

vb.net xml-parsing
1个回答
0
投票

您可以使用这些类来快速反序列化xml

Imports System.IO
Imports System.Xml.Serialization
<XmlRoot>
Public Class jmdict
    <XmlElement("entry")>
    Public Property entries As List(Of entry)
End Class
Public Class entry
    Public Property ent_seq As Integer
    Public Property k_ele As k_ele
    Public Property r_ele As r_ele
    <XmlElement("sense")>
    Public Property senses As List(Of sense)
End Class
Public Class sense
    <XmlElement("pos")>
    Public Property posses As List(Of String)
    <XmlElement("gloss")>
    Public Property glosses As List(Of gloss)
End Class
Public Class k_ele
    Public Property keb As String
    <XmlElement("ke_pri")>
    Public Property ke_pris As List(Of String)
End Class
Public Class r_ele
    Public Property reb As String
    <XmlElement("re_pri")>
    Public Property re_pris As List(Of String)
End Class
Public Class gloss
    <XmlAttribute("xml:lang")>
    Public Property lang As String
    <XmlText>
    Public Property Text As String
    Public Overrides Function ToString() As String
        Return Text
    End Function
End Class

反序列化的代码是

Dim serializer As New XmlSerializer(GetType(jmdict))
Dim d As jmdict
Using sr As New StreamReader("filename.xml")
    d = CType(serializer.Deserialize(sr), jmdict)
End Using

现在您可以遍历每个条目,条目的感官和感官的光泽

For Each e In d.entries
    Console.WriteLine($"seq: {e.ent_seq}")
    For Each s In e.senses
        For Each g In s.glosses
            Console.WriteLine($"Text: {g.Text}, Lang: {g.lang}")
        Next
    Next
Next

您的代码花费这么长时间的原因是

  1. 您正在将xml解析为字符串
  2. 您在分析行时将其插入到列表框中

您想在列表框中放什么?如果您按照我的说明进行了反序列化,则可以对数据中的特定列表进行数据绑定,或者对多个列表的查询结果进行数据绑定。

© www.soinside.com 2019 - 2024. All rights reserved.