gpt4 book ai didi

ruby - 当 XML 具有命名空间时,如何使用 Xpath 和 Nokogiri 打印值

转载 作者:行者123 更新时间:2023-12-04 16:59:21 27 4
gpt4 key购买 nike

我正在尝试解析下面具有命名空间的 XML 文件,但 doc.xpath() 和 doc.search() 不打印任何内容。

如何处理命名空间以使 doc.xpath() 和 doc.search() 工作?

因此,只有以下 XML 文件 doc.css() 有效。

<?xml version="1.0" encoding="UTF-8"?>
<ff-rep:MNEVENTS xmlns="http://www.example.com/MN-EVENTS"
xmlns:ff-rep="http://www.example.com/MN-EVENTS"
xmlns:sub-ff="http://www.example.com/sub-ff"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/MN-EVENTS ff-rep.xsd">
<FFEVENT>
<Ini>00:10</Ini>
<Code>MKK</Code>
<Ver>5.09</Ver>
</FFEVENT>
<KUI>
<Serial>IU00-35556</Serial>
<SubS>8879-22V</SubS>
</KUI>
<KUI>
<Serial>5561-PO2221</Serial>
<SubS>9980-1M</SubS>
</KUI>
</ff-rep:MNEVENTS>

但是如果我从这里删除顶部的“xmlns:...http ..”引用

<ff-rep:MNEVENTS xmlns="http://www.example.com/MN-EVENTS" 
xmlns:ff-rep="http://www.example.com/MN-EVENTS"
xmlns:sub-ff="http://www.example.com/sub-ff"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/MN-EVENTS ff-rep.xsd">

对此
<ff-rep:MNEVENTS>
doc.xpath()doc.search()两者都按预期工作。

我一直在尝试的代码如下:
#!/usr/bin/env ruby
require 'nokogiri'

doc = Nokogiri::XML(File.open("input.xml"))

puts doc.search('//Serial') # It doesn't work with "xmlns:http.." references
puts doc.xpath('//Serial') # It doesn't work with "xmlns:http.." references
puts doc.css("KUI Serial") # It works with "xmlns:http.." references

在此先感谢您的帮助

最佳答案

当 XML 文档中有 namespace 时,XPath 需要知道您想要处理的模式。在这种情况下,您可以使用 doc.xpath("//xmlns:Serial") .

为了让它更容易一些,Nokogiri 有一个方法来删除所有的命名空间。仅当具有相同名称但来自不同命名空间的元素不会发生冲突时,才应使用此方法。

doc.remove_namespaces!
doc.xpath("//Serial")

关于ruby - 当 XML 具有命名空间时,如何使用 Xpath 和 Nokogiri 打印值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23578861/

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