0

解析以下 XML 的最简单方法是什么?

<Fruit>
  <FruitId>Bannana</FruitId>
  <FruitColor>Yellow</FruitColor>
  <FruitShape>Moon</FruitShape>
  <Customer>
     <Name>Joe</Name>
     <Numbereaten>5</NumberEaten>
     <Weight>2.6</Weight>
  </Customer>
  <Customer>
     <Name>Mark</Name>
     <Numbereaten>8</NumberEaten>
     <Weight>5.0</Weight>
  </Customer>
</Fruit>
<Fruit>

......

假设我有一个包含多个的 XML 文件,并且我想提取信息,以便我可以制作一个仅对应于特定字段(水果 ID)和所有(吃掉的数量和重量对,不包括客户姓名)的 csv 我将如何完成这个?理想情况下,我希望能够获得一些代表以下内容的数据结构或 csv:

Bannana, 5, 2.6
Bannana, 8, 5
...
Apple 6, 5
Apple 3, 2

我知道有用于 Java 的 DOMParser 和 SAXParser,但我想知道在 2013 年的这个时代是否可以使用其他语言或其他方式轻松获取此信息以简化此操作。或者甚至可以捕获包含一些字典数据结构中的数据:

Bannana: [5,2.6], [8,5]

这样它就可以很容易地以编程方式迭代和提取的方式进行组织。

4

3 回答 3

1

这是 XSLT 的典型用例。

对于您的示例,XSLT 文件如下所示:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="text" encoding="ISO-8859-1" />
    <xsl:variable name="newline" select="'&#xA;'"/>
    <xsl:template match="Fruit">
        <xsl:for-each select="Customer">
            <xsl:value-of select="preceding-sibling::FruitId" />
            <xsl:text>,</xsl:text>
            <xsl:value-of select="Numbereaten" />
            <xsl:text>,</xsl:text>
            <xsl:value-of select="Weight" />
            <xsl:value-of select="$newline" />
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

对于转换,您可以使用以下 java 代码:

   Source xmlSource = new StreamSource(new File("xmlFile"));
   Source xsltSource = new StreamSource(new File("xsltFile"));
   Transformer transformer = TransformerFactory.newInstance().newTransformer();
   StreamResult csvResult = new StreamResult(new File("file.csv"));
   transformer.transform(xmlSource, csvResult);

XSLT 版本的好处是java 代码非常短。XSLT 文件可以保留在您的代码之外,并且可以在 XML 文件更改时轻松调整。

于 2013-05-10T19:43:35.003 回答
0

我最近使用了 SAXParser,它非常直接且易于实现。

尤其是 XMLReader 非常容易实现,而 XMLStreamReader 的实现只需要稍微多一点时间。

Reader 的好处是您可以从一个 xml 标签跳转到下一个标签,并在此处提取数据。StreamReader 设置时间稍长,但更灵活。

如果我是你,我只会阅读 SAXParser 和 DOMParsers 之间的区别,然后决定哪个最适合你的情况并使用它。

于 2013-05-10T19:44:45.977 回答
0

确实是 XSLT,或者如果您的示例非常简单并且您不想“学习”XSLT,我建议您

  • 使用 JAXB 从您的 XML 轻松创建对象
  • 然后将您认为适合的对象输出到文件中
于 2013-05-10T19:46:26.907 回答