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!

Lazy (=効率的) ですが、お勧めしません

于 2012-11-09T06:51:53.550 に答える
6

XML は名前空間にありますsome_namespaceが、XPath には名前空間バインディングがありません。基本的に、XML とは異なる要素をクエリしています。

クラーク表記法」を使用して、取得しようとしている要素は

{some_namespace}ShortMessage

ShortMessageただし、名前空間なしでクエリを実行しています。

プレフィックスがない、つまり名前空間がデフォルトの名前空間であるからといって、それを無視できるわけではありません。

于 2012-11-09T06:48:25.570 に答える