【发布时间】:2015-06-10 09:13:51
【问题描述】:
我想解组大型 XML 文件的一部分。已经有解决方案,但我想为自己的实现改进它。
请看下面的代码:(source)
public static void main(String[] args) throws Exception {
XMLInputFactory xif = XMLInputFactory.newFactory();
StreamSource xml = new StreamSource("input.xml");
XMLStreamReader xsr = xif.createXMLStreamReader(xml);
xsr.nextTag();
while(!xsr.getLocalName().equals("VersionList")&&xsr.getElementText().equals("1.81")) {
xsr.nextTag();
}
我想解组节点的 input.xml(如下所示):versionNumber="1.81"
使用当前代码,XMLStreamReader 将首先检查节点 versionNumber="1.80",然后检查 versionNumber 的所有子节点,然后再次移动到节点:versionNumber="1.81",它会满足while 循环的退出条件。
因为,我只想检查节点版本号,迭代它的子节点是不必要的,对于大型 xml 文件,迭代 1.80 版本的所有子节点将花费很长时间。我只想检查根节点(versionNumber),如果第一个根节点(versionNumber=1.80)不匹配,XMLStreamReader 应该直接跳转到下一个根节点((versionNumber=1.81))。但是用 xsr.nextTag() 似乎无法实现。有什么办法,只遍历所需的根节点?
input.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<fileVersionListWrapper FileName="src.h">
<VersionList versionNumber="1.80">
<Reviewed>
<commentId>v1.80(c5)</commentId>
<author>Robin</author>
<lines>47</lines>
<lines>48</lines>
<lines>49</lines>
</Reviewed>
<Reviewed>
<commentId>v1.80(c6)</commentId>
<author>Sujan</author>
<lines>82</lines>
<lines>83</lines>
<lines>84</lines>
<lines>85</lines>
</Reviewed>
</VersionList>
<VersionList versionNumber="1.81">
<Reviewed>
<commentId>v1.81(c4)</commentId>
<author>Robin</author>
<lines>47</lines>
<lines>48</lines>
<lines>49</lines>
</Reviewed>
<Reviewed>
<commentId>v1.81(c5)</commentId>
<author>Sujan</author>
<lines>82</lines>
<lines>83</lines>
<lines>84</lines>
<lines>85</lines>
</Reviewed>
</VersionList>
</fileVersionListWrapper>
【问题讨论】:
-
您可以通过 xpath
/fileVersionListWrapper/VersionList[@versionNumber='1.80']进行隔离,将仅返回 1.80 版本 .. 这就是您要找的东西
标签: java xml jaxb xmlstreamreader