在Java中使用数组解析复杂的XML

时间:2019-06-14 21:20:02

标签: java xml

我有一个复杂的XML结构,该结构是我从第三方收到的。我想解析上面的XML文档并使用各自的值创建一个Map。哪个库可用于解析复杂的XML

我尝试了XPath,但是无法获得预期的结果。

<OBJECT TYPE="BookListInterface" REF="OBJECT.BookListInterface">
    <Books TYPE="BookArray" length="5">
        <Item0 TYPE="BookName" REF="Item0.BookName.1">AA</Item0>
        <Item1 TYPE="BookName" REF="Item1.BookName.1">BB</Item1>
        <Item2 TYPE="BookName" REF="Item2.BookName.1">CC</Item2>
        <Item3 TYPE="BookName" REF="Item3.BookName.1">DD</Item3>
        <Item4 TYPE="BookName" REF="Item4.BookName.1">EE</Item4>
        <Item5 TYPE="BookName" REF="Item5.BookName.1">FF</Item5>
    </Books>
    <BookRates TYPE="DoubleArray" length="5">
        <Item0 TYPE="Double">10</Item0>
        <Item1 TYPE="Double">20</Item1>
        <Item2 TYPE="Double">30</Item2>
        <Item3 TYPE="Double">40</Item3>
        <Item4 TYPE="Double">50</Item4>
        <Item5 TYPE="Double">60</Item5>
    </BookRates>
</OBJECT>

我想解析上述XML文档,并使用相应的值(即

)创建一个Map
AA --> 10, 
BB --> 20 

,依此类推。如何在JAVA中实现这一目标?

1 个答案:

答案 0 :(得分:1)

应用此XSLT-1.0模板,您可以获得所需的输出:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:key name="keys" match="/OBJECT/Books/*" use="substring-after(local-name(),'Item')" />

    <xsl:template match="text()" />

    <xsl:template match="/OBJECT/BookRates/*">
      <xsl:variable name="number" select="substring-after(local-name(),'Item')" />
      <!-- Group this output to get a map result -->
        <xsl:value-of select="key('keys', $number)/text()" />  <!-- Mapping key -->
        <xsl:value-of select="' --> '" />
        <xsl:value-of select="text()" />                       <!-- Mapping value -->
        <xsl:value-of select="'&#xa;'" />
      <!-- End of grouping -->
    </xsl:template>

</xsl:stylesheet>

其主要功能是将/OBJECT/Books的值映射到/OBJECT/BookRates/的值。这可以通过使用substring-after(local-name(),'Item')创建一个键值来实现。

其(文本)输出为:

AA --> 10
BB --> 20
CC --> 30
DD --> 40
EE --> 50
FF --> 60

在Java中,您可以从结果中提取标记的Mapping keyMapping value值。