Xpath在Nokogiri中没有返回任何内容

Ala*_*ano 5 ruby xml nokogiri

可能重复:
Nokogiri/Xpath命名空间查询

假设有XML

<?xml version="1.0" encoding="utf-8"?> 
<SomeResponse xmlns="some_namespace"> 
  <Timestamp>......</Timestamp> 
  <Ack>Failure</Ack> 
  <Errors> 
    <ShortMessage>ShortMessage111.</ShortMessage> 
    <LongMessage>LongMessage111.</LongMessage> 
    <ErrorCode>1</ErrorCode> 
    <SeverityCode>Warning</SeverityCode> 
  </Errors> 
  <Errors> 
    <ShortMessage>ShortMessage222.</ShortMessage> 
    <LongMessage>LongMessage222.</LongMessage> 
    <ErrorCode>2</ErrorCode> 
    <SeverityCode>Warning2</SeverityCode> 
  </Errors>
  <!-- there might be many Errors nodes -->
  <Version>123</Version> 
  <Build>122345abt_3423423</Build> 
</SomeResponse> 
Run Code Online (Sandbox Code Playgroud)

我尝试使用Nokogiri查找所有错误及其长短信息.

我正在做:

doc = Nokogiri.XML(xml)
errors = doc.xpath("//Errors")
puts errors

errors2 = doc.xpath("//Errors//ShortMessage")
puts errors
Run Code Online (Sandbox Code Playgroud)

它没有显示任何内容.

我究竟做错了什么?

nur*_*tin 12

如果您不想处理命名空间,可以使用

doc.remove_namespaces!
Run Code Online (Sandbox Code Playgroud)

这是懒惰(=有效),但不推荐.


nin*_*ths 5

您的xml位于名称空间“ some_namespace”中,但您的xpath没有名称空间绑定。本质上,您要查询的是与XML中不同的元素。使用Clark表示法,您要获取的元素是{some_namespace} ShortMessage,但是您正在no名称空间中查询ShortMessage。仅仅因为没有前缀,即名称空间是默认名称空间,并不意味着您可以忽略它。