让Nokogiri将xmlns视为普通属性?

时间:2014-10-16 05:44:00

标签: ruby xml xml-parsing nokogiri

我知道如何使用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')的命名空间限定符前缀。

1 个答案:

答案 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>"]