2011-06-06 14 views
1

我正在擴展org.xml.sax.helpers.DefaultHandler以解析XML。 如何確定解析過程中的深度級別?Java:如何使用SAX確定XML解析期間的深度級別

例如:

<?xml version="1.0" encoding="utf-8"?> 
<jsk:Dataset gml:id="Dataset1" ....> 
    <gml:description>....</gml:description> 
    <gml:boundedBy> 
     ... 
    </gml:boundedBy> 
</jsk:Dataset> 

<jsk:Dataset>標籤是在水平0

<gml:description><gml:boundedBy>標籤1水平等等...

在右側方向上的任何指導理解。

回答

3

DefaultHandler類表示它正在通過startElement方法處理新元素,並且它已使用endElement方法完成處理。您可以通過在子類中重寫它們來掛鉤這些方法。

在這種情況下,也可以使用在使用實例字段存儲狀態的其他答案中所述的方法。輸入startElement時遞增,退出endElement時遞減。

+0

你的意思是在startElement()上存儲名字,然後檢查它是否以endElement的名字退出? – eros 2011-06-06 06:46:00

+0

如果你想要關卡並沒有別的東西,那就沒有必要了。有效的XML將要求每個開始標籤都被一個適當的結束標籤關閉,因此您將始終處於安全狀態。如果您在startElement上遞增,並且值從-1開始,則DataSet將具有值0,描述將具有1,並且邊界也會被視爲1,以在結束描述標記時該值變爲0。您需要將每個標籤視爲一個事件。在沒有結束事件時遇到的開始事件越多,深度計數就越大,然後進入結束事件開始與開始事件匹配的階段。 – 2011-06-06 06:52:11

+0

非常感謝。我知道了。 Vineet明確解釋。 – eros 2011-06-06 06:55:43

2

每次調用SAXListener.startTag()時,深度都在增加。 每次調用SAXListener.endTag()時,深度都在減小。

在這些回調方法中增加/減少處理程序類的實例字段,以跟蹤您的深度。

+0

對不起,我找不到SAXListener。 – eros 2011-06-06 06:46:52

+0

startTag()和endTag()是沒有任何參數引用的方法(根據給定的方法描述)。我怎樣才能確定當前的深度? – eros 2011-06-06 06:49:02

+0

我看到通過添加一個實例字段..與Vineet相同的方法,是不是? – eros 2011-06-06 06:50:26