4

祖先ノードが名前空間を定義している場合、それらを使用できます。

> 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" 

しかし、次の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>
    <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']

xml.remove_namespaces!またはリテラル名前空間引数at_xpathは最後の手段だと思います。

4

1 に答える 1

6

すべての名前空間をプログラムで収集するには、 を使用しますDocument#collect_namespaces

xml = Nokogiri::XML(xmldata)

ns = xml.collect_namespaces

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

出力:

John Doe
于 2012-12-20T00:08:27.080 に答える