2012-12-17 2 views
4

경우 동일한 노드에 정의 된 네임 스페이스와 노드를 검색 할, 내가 그들을 사용할 수 있습니다 : 나는 XML을 다음과 같이 수행하여야한다 무엇어떻게 조상 노드는 네임 스페이스를 정의

그러나
> Nokogiri::XML(<<-XML 
<?xml version='1.0' encoding='UTF-8'?> 
<package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="bookid"> 
    <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf"> 
    <dc:creator opf:role="aut">John Doe</dc:creator> 
    </metadata> 
</package> 
XML 
> xml.at_xpath("//dc:creator[@opf:role='aut']", xml.at_xpath("//xmlns:metadata").namespaces).text 
=> "John Doe" 

?

> Nokogiri::XML(<<-XML 
<?xml version='1.0' encoding='UTF-8'?> 
<package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="bookid"> 
    <metadata> 
    <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf" opf:role="aut">John Doe</dc:creator> 
    </metadata> 
</package> 
XML 
> xml.at_xpath("//dc:creator[@opf:role='aut']", xml.at_xpath("//xmlns:metadata").namespaces).text 
Nokogiri::XML::XPath::SyntaxError: Undefined namespace prefix: //dc:creator[@opf:role='aut'] 

나는 at_xpath에 대한 xml.remove_namespaces! 또는 문자 네임 스페이스 인수는 최후의 수단이라고 생각합니다.

답변

6

프로그래밍 방식으로 모든 네임 스페이스를 수집하려면 Document#collect_namespaces을 사용하십시오.

xml = Nokogiri::XML(xmldata) 

ns = xml.collect_namespaces 

puts xml.at('//dc:creator[@opf:role="aut"]', ns).text 

출력 :

John Doe 
+0

나는 우리가 사전에 네임 스페이스를 알고있는 경우에 우리는 문자 그대로 네임 스페이스를 지정할 수 있다는 것을 알고 있지만, 어떻게 네임 스페이스 프로그래밍받을 수 있나요? – hiroshi

+0

코드 샘플을 업데이트했습니다. –

+0

감사! 나는'Nokogiri :: XML # collect_namespaces' 메소드를 발견하지 못했습니다. – hiroshi

관련 문제