2010-08-02 33 views
4

我只想解析感興趣的XML元素(例如見下面:名稱等於數學的類元素),我想停止一次第一個元素擊中這個條件被解析。 (因爲只有一個名字是數學的類,所以一旦找到元素就不需要繼續)。但是,如果我按照以下方式實現,代碼會在找到我感興趣的元素(xml文件非常長,因此需要很長時間)後繼續讀取整個文件。我的問題是如何解決它,一旦名稱=數學的第一類元素被解析?在XML:TWIG,如何停止解析一次找到感興趣的元素

my $twig = new XML::Twig(TwigRoots => {"class[\@name='math']" => \&class}); $twig->parsefile(shift @ARGV);

之外,我也想刪除XML文件中這個類,它被解析,以便解析與其他名稱的類時,下一次(不只是從內存中)後,該類元素將不會被解析。有可能這樣做嗎?

回答

6

看來你要尋找的是XML ::嫩枝的finish_printfinish_now

finish_print

停止小枝處理,沖洗樹枝,然後繼續完成打印 文檔一樣快可能。修改文檔 並修改完成時,使用 此方法。

finish_now

停止枝處理,沒有完成解析文檔(其 實際上可能是其中finish_now是 稱爲點之後沒有很好地形成 )。在執行Lparse>或parsefile調用後恢復執行。該樹枝的內容 是已經解析過的,所以 遠(當時所有打開元素 finish_now被調用都被認爲是 已關閉)。

+0

這是一個使用finish_now的例子:http://cpansearch.perl.org/src/MIROD/XML-Twig-3.35/tools/xml_grep/xml_grep – DVK 2010-08-02 02:48:11

+0

THX DVK。似乎我必須安裝perl 5.10.X來使用finish_now而我的系統。是5.8.4。安裝5.10.X很容易嗎? 此外,即使使用了finish_now,如果一個類在有很多內容的類後面,它仍然需要時間才能找到。我可以指出從哪裏開始解析元素的行號?我可以使用grep來獲取所有類元素的行號。爲什麼讓樹枝逐行尋找感興趣的元素,這很慢? – user399517 2010-08-02 05:24:28

+0

總之,假設名稱=數學的類從2000行開始,我可以從第2000行解析xml,而不必從xml文件的開頭開始?我不明白爲什麼twig花了這麼多時間tp解析我的xml文件,即使我設置了TwigRoots => {「class [\ @ name ='math']。我認爲它應該有一些方法可以跳過讀取其他的子元素類,也許我錯了,它仍然是逐行解析,只是不要將它們存儲在內存中 – user399517 2010-08-02 05:29:56