加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 03:04:23 所属栏目:百科 来源:网络整理
导读:如果祖先节点定义了名称空间,我可以使用它们: 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/" xm
如果祖先节点定义了名称空间,我可以使用它们:

> 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读