8

可能重复:
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> 

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

我正在做:

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

errors2 = doc.xpath("//Errors//ShortMessage")
puts errors

它什么也没显示。

我究竟做错了什么?

4

2 回答 2

17

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

doc.remove_namespaces!

它是懒惰的(= 高效),但不推荐

于 2012-11-09T06:51:53.550 回答
6

您的 XML 在名称空间中,some_namespace但您的 XPath 没有名称空间绑定。您实际上是在查询与 XML 中不同的元素。

使用“克拉克符号”,您要尝试的元素是

{some_namespace}ShortMessage

但您ShortMessage在无命名空间中查询。

仅仅因为没有前缀,即命名空间是默认命名空间,并不意味着你可以忽略它。

于 2012-11-09T06:48:25.570 回答