簡體   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