gpt4 book ai didi

ruby - 如何搜索具有在同一节点中定义的命名空间的节点

转载 作者:数据小太阳 更新时间:2023-10-29 07:29:00 24 4
gpt4 key购买 nike

如果祖先节点定义了命名空间,我可以使用它们:

> 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 的文字命名空间参数是最后的手段。

最佳答案

要以编程方式收集所有命名空间,请使用 Document#collect_namespaces

xml = Nokogiri::XML(xmldata)

ns = xml.collect_namespaces

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

输出:

John Doe

关于ruby - 如何搜索具有在同一节点中定义的命名空间的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13910545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com