2012-03-29 50 views
0

我有一個文件,我正在解析自己。每當我發現了一個「<」或「>」我分割字符串,像這樣:解析包含文件的字符串時出錯

xml = file.split("[<>]"); 

這會給我的標籤,數據和結束標記。

一旦完成,我確定它是什麼類型的標籤,並以不同的方式處理它。如果它是一個物品標籤,它有一個描述。像這樣:

<description> 
<![CDATA[ 
<img width="460" height="259" src="http://www.cbc.ca/gfx/images/news/topstories/2012/03/28/hi-parliament-stop-852-7931-6col.jpg"><br/><p>Finance Minister Jim Flaherty's budget will take the shine off what critics call MPs' gold-plated pensions, reports Greg Weston for CBC News.</p> 
]]> 
</description> 

這裏的問題是,它會分裂的所有「<」和「>」這樣的描述,我正在尋找丟失的部分。

我該如何解決描述和其他我正在搜索的標籤,其中包含多個「<」和「>」,我不在乎? (那些不是圍繞開口標記和結束標記?

+0

如果這實際上是XML,爲什麼不使用XML解析器? – 2012-03-29 05:44:30

+0

我想學習如何做我自己......通過它思考和分析它自己 – BigBug 2012-03-29 05:45:27

+0

WY不要試圖一個標準的XML解析器? – Nishant 2012-03-29 05:46:13

回答

1

Trail: Java API for XML Processing並請忘記»讓我們在[<>]儘快再次將一個字符串分解成爲可能。

+0

謝謝,但我不想使用API​​,我想建立自己的.. – BigBug 2012-03-29 05:46:37

+0

儘管你想,這個答案仍然是一樣的。 – Joey 2012-03-29 05:47:14

2

正確的解析器和正則表達式之間的一個主要區別是解析器使用了一個堆棧,因此它可以跟蹤嵌套結構。在尖括號中給出了一個平坦的字符串列表,沒有指示哪些元素嵌套在其他元素中;這就是爲什麼它找不到結束標籤匹配給定的開始標籤。

想想如果XML文件中包含該發生的事情:

<foo> 
    <foo> 
    </foo> 
</foo> 

當你看到<foo>,你不能只是尋找下一個</foo>並承擔之間是身體一切。

你需要做的是當你看到一個開始標籤時,把它推到你當前「在」的一堆元素上。當您看到一個結束標記時,請檢查它是否與堆棧中最頂端的開始標記匹配。如果是這樣,從堆棧中彈出該標籤 - 你不再屬於這個元素。如果不匹配,則表示發生錯誤;輸入有<foo></bar>或類似的東西。

對於HTML(而不是XML)它更復雜,因爲某些結束標記是可選的:<div><p></div>是不是一個錯誤,例如。你可以閱讀HTML規範,並找出所有的規則和特殊情況,你可以只使用這中現有的解析器庫之一,並保存自己很多的麻煩。

+0

感謝您的意見,事實上有幫助,不像很多其他評論,我一直在接受... – BigBug 2012-03-29 07:25:34

+0

而且這個答案不會完成,沒有一個鏈接[所有StackOverflow上最高的答案](http ://stackoverflow.com/a/1732454/226975)。 :-) – Wyzard 2012-03-29 07:34:51

+0

順便說一下,您可能有興趣使用SAX或StAX,或者至少研究其API以獲得教育價值。他們負責較低層次的解析,因此您可以將該文件視爲一系列開始標記和結束標記,而不是一系列字符,但它們會將所有有意義的解釋(以及與堆棧相關的東西)留給應用程序。 – Wyzard 2012-03-29 07:47:10

相關問題