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

How to parse the bcompare xml report using DOM/SAX or any parser in java

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

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

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

你能帮我解决一下吗

下面是 bcompare xml 报告:

<?xml version="1.0" encoding="utf-8"?>
<bcreport created="16-11-2017 20:20:54">
<foldercomp>
    <ltpath>E:\compare\CODE1</ltpath>
    <rtpath>E:\compare\CODE2</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:\compare\CODE2\Dir1\Dir3\Dir4  -->
                    <size>288</size>
                </rt>
                <filecomp status="rtnewer">
                    <lt>
                        <name>File5 (2).txt</name>  <!-- E:\compare\CODE1\Dir1\Dir3\Dir4\File5 (2).txt -->
                        <size>139</size>
                    </lt>
                    <rt>
                        <name>File5 (2).txt</name>   <!-- E:\compare\CODE2\Dir1\Dir3\Dir4\File5 (2).txt -->
                        <size>146</size>
                    </rt>
                </filecomp>
            </foldercomp>
        </foldercomp>
        <filecomp status="rtonly">
            <rt>
                <name>File1 (1).txt</name>  <!-- E:\compare\CODE2\File1 (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:\compare\CODE1\Dir2\File2.txt -->
                <size>143</size>
            </lt>
            <rt>
                <name>File2.txt</name>   <!-- E:\compare\CODE2\Dir2\File2.txt -->
                <size>153</size>
            </rt>
        </filecomp>
    </foldercomp>
    <filecomp status="rtnewer">
        <lt>
            <name>File1 (2).txt</name>   <!-- E:\compare\CODE1\File1 (2).txt -->
            <size>132</size>
        </lt>
        <rt>
            <name>File1 (2).txt</name>  <!-- -E:\compare\CODE1\File1 (2).txt -->
            <size>139</size>
        </rt>
    </filecomp>
    <filecomp status="rtnewer">
        <lt>
            <name>File1 (3).txt</name>   <!-- E:\compare\CODE1\File1 (3).txt -->
            <size>144</size>
        </lt>
        <rt>
            <name>File1 (3).txt</name>  <!-- E:\compare\CODE2\File1 (3).txt -->
            <size>150</size>
        </rt>
    </filecomp>
</foldercomp>

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

XML 输出对我来说很有意义。我从这里了解到的是:

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

一个文件夹可以有多个文件夹,一个文件夹可以有多个文件。对于每个比较,都有左项和右项。所以,你需要做的是 re-think 关于你的解析策略。每个 foldercomp 至少有 2 个(可能更多)children,每个 filecomp 标签有两个(或更多)children.

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

filecomp 的状态让您了解差异的本质。因此,如果它是 rtnew,则表示已添加。我会用绿色等

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

我希望它有意义。

编辑:

如果您需要 SAX 解析器的示例代码,here it is

我给了你领导,但我不会做你的工作。对不起。

编辑 2:

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

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

switch(tag){

  foldercomp: 
    ops
  filecomp:
    ops
  rt:
    ops
  lt:
    ops

}

自己试试看。如果您通过实施它 运行 进入墙,包括我在内的其他 Whosebug 用户将很乐意提供帮助。但你需要先尝试。

干杯。