2012-06-16 4 views
2

XML 문서를 구문 분석 할 수있는 Perl 라이브러리를 아는 사람이 있습니까? CSS 선택기와 네임 스페이스를 통해 노드를 선택할 수 있습니까?CSS 선택기를 사용한 Perl XML 구문 분석

배경 : perl libxml 패키지를 사용하여 기본 네임 스페이스로 문서를 구문 분석하려고했지만 루트 노드에서 기본 네임 스페이스를 제거 할 때까지 아무 것도 반환하지 않았습니다.

이 내가 주제에 발견하는 내용입니다 : //message 나에게 펄 libxml 어떤 ​​결과를 제공하지 않을

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

의 XPath : https://mail.gnome.org/archives/xml/2003-April/msg00143.html

그래서 간단한 예를 들어이 같은 파일이 될 것입니다. 라이브러리가 제대로 작동하고 있다는 것을 알고 있지만 여전히 그 내용을 파싱해야하므로 CSS 선택기 기반 라이브러리가 더 성공적 일 수 있다고 생각했습니다.

+0

당신은 당신이 원하는 것을 예를 제공 할 수 있습니다 : 당신은 어느 요소 이름에 대한 핸들러를 설정함으로써, 또는 당신은 작성합니다 핸들러를 사용하려면 my @messages= $twig->findnodes('//message')

같은 XPath 쿼리를 사용하여 message를 얻을 것 분석하고 얻고 자하는 것이 무엇입니까? –

+0

@ user1215106 : 했어. – moritz

+0

Pro 팁 : 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 : 일반적으로 XPath보다 선호하기 때문에 실제로 CSS 선택기 라이브러리를 찾고있었습니다. 이것은 왜 당신이 upvote하지만 받아 들일 수 없습니다. – moritz

0

XML :: Twig도 네임 스페이스를 무시합니다.

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

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

사용할 수 있도록 다시 쓸 수 있습니까? CSS 셀렉터를 통해 노드에 도착하도록 HTML-Selector-XPath? – daxim

+0

아니요 -) XML :: 나뭇 가지를 사용하면'tag.class'를 사용할 수 있습니다.이 태그는 유용한 바로 가기 인 경우가 많습니다. – mirod