2012-06-16 46 views
2

是否有人知道可以解析XML文檔的Perl庫,並使我可以通過CSS選擇器和名稱空間支持來選擇節點?使用CSS選擇器解析Perl XML

背景: 我試圖用perl libxml軟件包解析一個默認命名空間的文檔,但直到我從根節點刪除默認命名空間時,它才返回任何東西。

這是我的話題發現: https://mail.gnome.org/archives/xml/2003-April/msg00143.html

因此,一個簡單的例子是這樣的文件:

<?xml version="1.0" encoding="utf-8"?> 
<root xmlns="http://example.com/ns"> 
    <message>Hi</message> 
</root 

的XPath //message不會給我用Perl libxml的任何結果。我知道圖書館做的工作完全正常,但我仍然需要解析這些東西,所以我認爲基於CSS選擇器的庫可能會更成功。

+0

你能提供一個例子,你想要什麼解析和你想得到什麼? –

+0

@ user1215106:我做到了。 – moritz

+0

專業提示:通過libxml [Xacobeo](http://p3rl.org/Xacobeo)的圖形界面可以輕鬆搞定XPath。屏幕截圖:http://i.stack.imgur.com/fOTus.png – daxim

回答

1

這應該與任何你可以扔的libxml工作。

use strictures; 
use HTML::TreeBuilder::LibXML qw(); 
BEGIN { HTML::TreeBuilder::LibXML->replace_original; } 
use Web::Query qw(); 

print Web::Query->new_from_html(<<'MARKUP')->find('root > message')->text; 
<?xml version="1.0" encoding="utf-8"?> 
<root xmlns="http://example.com/ns"> 
<message>Hi</message> 
</root> 
MARKUP 

1; 
+0

感謝您對Web :: Query的提示。我希望找到更多的CPANish。但是這樣做會很好。 – moritz

+0

[Web :: Query **在CPAN上是可用的。](https://metacpan.org/release/Web-Query) – daxim

+0

事實上,即使老闆也會很開心;) – moritz

1

試試這個:

#!/usr/bin/perl 

use XML::XPath; 
use XML::XPath::XMLParser; 

my $xp = XML::XPath->new(filename => 'test.xhtml'); 

print XML::XPath::XMLParser::as_string($_), "\n" for ($xp->find('root/message')->get_nodelist); 
+0

非常感謝。您的代碼適用於我提供的示例xml以及生產數據。我有幾乎相同的代碼,除了我使用XML :: Parser,它沒有找到消息節點。 – moritz

+0

問題是關於CSS選擇器。 – daxim

+0

@ user1215106:我的確在尋找一個CSS選擇器庫,因爲我通常更喜歡它通過XPath。這就是爲什麼你會得到贊成但不接受。 – moritz

0

除非你也告訴它XML :: Twig會高興地忽略名稱空間。你會得到message通過設置在元素名稱的處理程序,或通過使用XPath查詢像my @messages= $twig->findnodes('//message')

要使用的處理程序,你可以這樣寫:

XML::Twig->new(twig_handlers => { message => \&process_message }) 
     ->parsefile("my.xml");) 

sub process_message 
    { my($twig, $message)= @_; 
    print $message->text; 
    } 
+0

您可以重寫這個以使用HTML-Selector-XPath,以便我們通過CSS選擇器到達節點? – daxim

+0

否; - )XML :: Twig允許您使用'tag.class',但我經常發現它是一個有用的快捷方式 – mirod