如何使用DOM/SAX或java中的任何解析器解析bcompare xml报告



在我们的项目中,我们希望从xml生成excel报告,该报告具有两个文件夹的所有差异。

我试图从xml节点获取文件的完整路径,但我对节点名称感到困惑,因为所有父节点(foldercomp)都有相同的名称。

并且可以为此xml格式创建xsd,xsd复杂类型中不接受具有相同类名的内部类。

你能帮我处理这个吗

以下是bcompare xml报告:

<?xml version="1.0" encoding="utf-8"?>
<bcreport created="16-11-2017 20:20:54">
<foldercomp>
<ltpath>E:compareCODE1</ltpath>
<rtpath>E:compareCODE2</rtpath>
<mode>Differences</mode>
<foldercomp>
<lt>
<name>Dir1</name>
<size>696</size>
</lt>
<rt>
<name>Dir1</name>
<size>846</size>
</rt>
<foldercomp>
<lt>
<name>Dir3</name>
<size>424</size>
</lt>
<rt>
<name>Dir3</name>
<size>431</size>
</rt>
<foldercomp>
<lt>
<name>Dir4</name>
<size>281</size>
</lt>
<rt>
<name>Dir4</name>       <!-- E:compareCODE2Dir1Dir3Dir4  -->
<size>288</size>
</rt>
<filecomp status="rtnewer">
<lt>
<name>File5 (2).txt</name>  <!-- E:compareCODE1Dir1Dir3Dir4File5 (2).txt -->
<size>139</size>
</lt>
<rt>
<name>File5 (2).txt</name>   <!-- E:compareCODE2Dir1Dir3Dir4File5 (2).txt -->
<size>146</size>
</rt>
</filecomp>
</foldercomp>
</foldercomp>
<filecomp status="rtonly">
<rt>
<name>File1 (1).txt</name>  <!-- E:compareCODE2File1 (1).txt -->
<size>143</size>
</rt>
</filecomp>
</foldercomp>
<foldercomp>
<lt>
<name>Dir2</name>
<size>286</size>
</lt>
<rt>
<name>Dir2</name>
<size>296</size>
</rt>
<filecomp status="rtnewer">
<lt>
<name>File2.txt</name>   <!-- E:compareCODE1Dir2File2.txt -->
<size>143</size>
</lt>
<rt>
<name>File2.txt</name>   <!-- E:compareCODE2Dir2File2.txt -->
<size>153</size>
</rt>
</filecomp>
</foldercomp>
<filecomp status="rtnewer">
<lt>
<name>File1 (2).txt</name>   <!-- E:compareCODE1File1 (2).txt -->
<size>132</size>
</lt>
<rt>
<name>File1 (2).txt</name>  <!-- -E:compareCODE1File1 (2).txt -->
<size>139</size>
</rt>
</filecomp>
<filecomp status="rtnewer">
<lt>
<name>File1 (3).txt</name>   <!-- E:compareCODE1File1 (3).txt -->
<size>144</size>
</lt>
<rt>
<name>File1 (3).txt</name>  <!-- E:compareCODE2File1 (3).txt -->
<size>150</size>
</rt>
</filecomp>
</foldercomp>

文件夹和文件中差异的lt-CODE1、rt-CODE2、foldercomp和filecomp标记

XML输出对我来说很有意义

Dir1
|
+-- Dir3
|    |
|    +Dir4
|      |
|      +File5
(etc)

一个文件夹可能有更多的文件夹,一个文件夹也可能有许多文件。对于每个比较,都有左项和右项。所以,你需要做的是重新思考你的解析策略。每个foldercomp至少有2个子(可能更多),每个filecomp标记有两个子(或更多)。

如果我是你,我会使用foldercomp和filecomp打开标记将行和列的值增加1,关闭标记将列减少,同时以类似的方式将行增加1。lt和rt打开标记以增加行值(而不是列),并忽略相同的关闭标记。我会用粗体打印文件夹和文件名,并保留正常的差异。

filecomp上的状态可以让您了解差异的性质。所以,如果它是rtnew,那就意味着它被添加了。我会使用绿色等

通过sax解析器实现它应该太难了。

我希望这是有道理的。

编辑:

如果您需要SAX解析器的示例代码,这里就是

我已经给了你线索,但我不会做你的工作。很抱歉

第2版:

使用SAX解析器非常简单。查看上面的文档和示例。

将使用sax解析器解析XML视为switch/case语句。当当前标签是什么时,做你需要做的事情,当其他事情时,做任何需要的事情等等。你可能也需要保留上下文。

switch(tag){
foldercomp: 
ops
filecomp:
ops
rt:
ops
lt:
ops
}

自己试试看。如果你在实现它时遇到了麻烦,包括我在内的stackerflow用户会很乐意提供帮助。但你需要先尝试一下。

干杯。

最新更新