繁体   English   中英

如何使用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,在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)

一个文件夹可能有更多文件夹,一个文件夹可能有很多文件。 对于每个比较,都有左项和右项。 因此,您需要做的是重新考虑您的解析策略。 每个foldercomp至少有2个(可能更多)子级,每个filecomp标记有两个(或更多)子级。

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

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

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

我希望这是有道理的。

编辑:

如果您需要SAX解析器的示例代码, 则为

我已经带头了,但是我不会做你的工作。 抱歉。

EDIT2:

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

考虑使用sax解析器解析XML是作为switch / case语句。 当当前标记是某件事时,请执行所需的操作,在其他事情时,请执行所需的操作等。您可能还需要保留上下文。

switch(tag){

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

}

自己尝试看看。 如果您通过实施它遇到麻烦,那么包括我自己在内的其他stackoverflow用户将很乐意为您提供帮助。 但是您需要先尝试。

干杯。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM