![]() |
1
13
我将使用SAX解析器通过两次传递来解决这个问题(顺便提一下,我还将使用CSV生成库来创建输出,因为这将处理CSV涉及的所有复杂字符转义(但我在草图中没有实现)。 第一次通过: 第二遍: 我假设XML文件格式良好。我假设我们没有具有预定义顺序的scheme/DTD。 在第一步中,我假设将为每个包含文本内容的XML元素或任何属性(我假设属性将包含某些内容!)添加一个CSV列。 第二个过程建立了目标列的数量,将执行实际的CSV输出。 根据您的示例XML,我的代码草图将生成:
请注意,我使用了googlecollections LinkedHashMultimap,因为这在将多个值与单个键关联时非常有用。我希望你觉得这个有用!
|
![]() |
2
9
这看起来是一个使用XSL的好例子。根据您的基本需求,与自定义解析器或序列化程序相比,使用XSL可能更容易找到正确的节点。这样做的好处是,XSL可以针对“//Item//AverageTime”或您需要的任何节点,而不必担心节点深度。 更新:下面是我创建的xslt,以确保它按预期工作。
|
![]() |
3
6
我不确定我是否理解这个解决方案应该有多通用。是否确实要为通用解决方案分析两次1 GB文件?如果你想要一些普通的东西,你为什么要跳过
根据我的经验,通常最好以特定的方式解析特定的文件(但这并不排除使用通用API)。我的答案将朝这个方向发展(澄清之后我会更新它)。
XML Manager
CSV Manager
. 看到了吗
How to convert CSV into XML and XML into CSV using Java
举个完整的例子。这种方法非常简单:使用XPath表达式定义数据字段(这在您的情况下是完美的,因为您可以有“额外”元素),解析文件,然后传递结果
你可以得到一个单一的开发者许可证为170美元,这是不是很昂贵相比,开发人员的每日费率。
另一种选择是使用 Spring Batch . springbatch提供了所需的一切 XML files 作为 input 或输出(使用您选择的StAX和XML绑定框架)和 flat files 作为输入或 output Smooks 将XML转换为CSV transformations . 另请参见: 另一种选择是使用StAX解析器或者,为什么不使用 VTD-XML 和XPath。看看: |
![]() |
4
2
根据所描述的需求编写代码的最佳方法是使用FreeMarker和XML处理的简单特性。 See the docs . 在这种情况下,您只需要生成CSV的模板。 XMLGen ,但方法非常相似。只要看看这个图表和示例,就可以输出CSV而不是SQL语句。 这两种类似的方法不是“常规”的,但是根据您的情况可以很快完成工作,而且您不必学习XSL(我认为很难掌握)。 |
![]() |
5
2
|
![]() |
6
1
我不相信SAX是适合您的最佳方法。 不过,在这里使用SAX的方法有很多种。
启动ListingDetails时,将映射初始化为处理程序上的成员变量。在每个子元素中,在该映射中设置适当的键值。完成ListingDetails后,检查映射并显式地模拟值,例如缺少元素的nulls。假设每个项目有一个ListingDetails,则将其保存到处理程序中的成员变量中。 现在,当item元素结束时,有一个函数可以根据映射按所需顺序写入csv行。
|
![]() |
7
1
请注意,这将是使用XSLT的一个主要示例,除了大多数XSLT处理器将整个XML文件读入内存之外,内存不是一个选项,因为它很大。但是,请注意,企业版Saxon可以执行流式XSLT处理(如果XSLT脚本遵守这些限制)。 如果适用,您可能还希望在JVM之外使用外部XSLT处理器。这为更多的选择打开了大门。 撒克逊EE流媒体: http://www.saxonica.com/documentation/sourcedocs/serial.html |
![]() |
8
0
你可以用XStream( http://x-stream.github.io/ http://www.wutka.com/jox.html |