![]() |
1
6
如果您控制XML的定义,您可以使用XML绑定工具,例如 JAXB公司 (用于XML绑定的Java体系结构。)在JAXB中,您可以为XML结构定义模式(支持XSD和其他类型),或者为Java类添加注释,以便定义序列化规则。一旦您在XML和Java之间有了明确的声明性映射,那么到XML的编组和从XML的解编组就变得微不足道了。 使用JAXB确实比SAX处理程序需要更多的内存,但存在按部分处理XML文档的方法: Dealing with large documents . |
|
2
5
下面是一个将JAXB与StAX一起使用的示例。 输入文档:
个人.java:
地址.java:
个人列表处理程序.java:
|
![]() |
3
0
我一直在使用 xsteam 将我自己的对象序列化为xml,然后将它们作为Java对象加载回来。如果您可以将所有内容表示为POJO,并正确地注释POJO以匹配xml文件中的类型,那么您可能会发现它更容易使用。 当String在XML中表示对象时,您可以只写:
我一直使用它在一行中将对象加载到内存中,但如果您需要对其进行流式处理,您应该能够使用 HierarchicalStreamReader 以遍历文档。这可能与@Dave建议的Simple非常相似。 |
![]() |
4
0
在SAX中,解析器在处理程序中“推送”事件,因此您必须像这里习惯的那样进行所有内务处理。另一种选择是StAX(
根据XML的精确结构,可能会有一种“中间方法”来使用这样的工具包 XOM ,具有一种操作模式,您可以将文档的子树解析为类似DOM的对象模型,处理该分支,然后将其丢弃并解析下一个分支。这对于具有许多相似元素的重复文档来说是很好的,每个元素都可以单独处理-您可以轻松地在每个分支中编程到基于树的API,但仍然具有流行为,可以有效地解析大型文档。
您可以通过StAX和JAXB的组合来实现类似的事情——定义表示重复元素的JAXB注释类(本例中为Item),然后创建StAX解析器,导航到第一个
|
![]() |
5
0
正如其他人所建议的那样,Stax模型是一种更好的方法,可以最大限度地减少内存足迹,因为它是一种基于推送的模型。我个人使用了Axio(它在Apache Axis中使用),并使用XPath表达式解析元素,这比您在提供的代码片段中所做的遍历节点元素更不冗长。 |
![]() |
6
0
我一直在使用这个图书馆。它位于标准Java库的顶部,让我更轻松。特别是,你可以通过名称询问特定的元素或属性,而不是使用你描述的大“if”语句。 http://marketmovers.blogspot.com/2014/02/the-easy-way-to-read-xml-in-java.html |
|
7
0
还有另一个库支持更紧凑的XML解析,RTXML。图书馆及其文档在 rasmustorkel.com 。我实现了对原始问题中的文件的解析,我在这里包含了完整的程序:
您会注意到检索函数以N、E或D结尾。它们指的是当所需的数据项不在时该怎么做。N代表return Null,E代表throw Exception,D代表use Default。 |
![]() |
8
0
不使用外部包,甚至不使用XPath的解决方案:
使用
1) 基本解决方案: a) 字段
b) 让你
c)
……那么这一切意味着什么?在任何时候,你都知道你所处的“解析模式”。。。你也可以看看
你的
2) 更“专业”的解决方案:
那么,具体子类的突出部分:
PS这是更复杂的东西的起点:例如,你可以设置
|
|
9
-1
} |