【问题标题】:How to parse the bcompare xml report using DOM/SAX or any parser in java如何使用 DOM/SAX 或 java 中的任何解析器解析 bcompare xml 报告
【发布时间】:2017-11-16 15:28:27
【问题描述】:

在我们的项目中,我们想从 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:\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 标签用于文件夹和文件中的差异

【问题讨论】:

    标签: java xml parsing xsd beyondcompare


    【解决方案1】:

    XML 输出对我来说很有意义。我的理解是:

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

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

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

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

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

    我希望这是有道理的。

    编辑:

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

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

    EDIT2:

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

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

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

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

    干杯。

    【讨论】:

    • 是的,正确!如果您有示例代码会更有帮助
    • 对不起,我不熟悉 xml 解析器,所以我添加了评论,谢谢。
    • 什么都不熟悉也没关系。它只会为学习新事物打开一扇门。请参阅上面的编辑。
    猜你喜欢
    • 1970-01-01
    • 2015-10-08
    • 2011-06-17
    • 1970-01-01
    • 2017-07-27
    • 2012-08-27
    • 1970-01-01
    • 2013-01-31
    • 2012-07-03
    相关资源
    最近更新 更多