我知道如何使用Nokogiri中的命名空间,但有时候,我想看看文档是如何实际指定的。
在这些情况下,如果Nokigiri可以简单地表现得像对命名空间一无所知,对待" xmlns"就像任何其他属性一样,并将元素视为完全按照所写的名称(冒号和所有,如果存在)以及所有在默认命名空间中。
有没有办法实现这个目标?
编辑:添加示例
所以,让我们说我正在使用Nokogiri检查生成的SVG。我想知道命名空间是使用xmlns属性在根元素中指定的,我想知道子元素使用隐式名称间距。
<svg version="1.1" width="300" height="200" xmlns="http://www.w3.org/2000/svg">
<path d="M 10,10 l 5,20" />
</svg>
如果我使用Nokogiri解析它,那么我可以找到&#34;路径&#34;要素如下:
svg_doc.xpath('//ns:svg/ns:path', 'ns' => "http://www.w3.org/2000/svg")
这告诉我文件是&#34;正确&#34;在产生具有预期命名空间的元素方面,但不告诉我有关如何指定命名空间的任何信息。
如果我能得到一个完全不知道命名空间的文档实例,那么......
我可以查询&#34; xmlns&#34;属性值使用svg_doc.root['xmlns']
...
我可以发现有一条&#34;路径&#34; &#34; svg&#34;的元素孩子root元素,并且两个元素都没有使用svg_doc.xpath('//svg/path')
的命名空间限定符前缀。
答案 0 :(得分:0)
“Searching an HTML / XML Document”的“命名空间”部分是关于使用CSS选择器的部分:
不要被愚弄。您不必使用XPath来获取命名空间的好处。也可以使用CSS选择器。 CSS只使用管道符号来表示命名空间搜索。
让我们看一下之前的搜索被重写为使用CSS:
@doc.css('xmlns|title') # => ["<title>Example Feed</title>", "<title>Atom-Powered Robots Run Amok</title>"]
使用CSS时,如果命名空间名为“xmlns”,则甚至可以省略命名空间名称。这意味着你的CSS将减少到:
@doc.css('title') # => ["<title>Example Feed</title>", "<title>Atom-Powered Robots Run Amok</title>"]