Xpath本地化

时间:2015-03-27 22:54:41

标签: ruby xml xpath nokogiri

我被困在一个Xpath表达式上.. 你能帮我找到Xpath来获得像“SecSE”这样的“Entry”元素吗? 我也想得到itemName属性内容:)

非常感谢

这是我的XML:

<?xml version="1.0" encoding="UTF-8"?>
  <MLiveDataLog>
  <ControllerPath>Controller</ControllerPath>
  <description>Autogenerated XML export file</description>
  <Log xmlns="http://iec.ch/61400/ews/1.0/">
       <LogName>AllLiveData</LogName>
     <Entry tabName="Test" itemName="Turbine" aggregation="2" description="">
       <TimeOfEntry>
         <SecSE>1427199750</SecSE>
         <Tq>
           <LSK>false</LSK>
         </Tq>
       </TimeOfEntry>
     </Entry>
  </Log>
</MLiveDataLog>

我像这样使用红宝石和Nokogiri:

require 'nokogiri'


    doc = Nokogiri::XML(File.open("test.xml"))
    puts doc.xpath("/MLiveDataLog/Log/Entry/@itemName")     

好像我无法在“Log”元素下访问

1 个答案:

答案 0 :(得分:1)

输入文档的部件位于默认命名空间

<Log xmlns="http://iec.ch/61400/ews/1.0/">

Log元素及其所有后代元素都在该命名空间中,并且命名空间是这些元素的标识的一部分。也就是说,Log{http://iec.ch/61400/ews/1.0/}Log是非常不同的元素。

在XPath表达式中绝对需要考虑命名空间。在您的代码中,您需要将此命名空间与前缀一起声明 - 并为名称空间中的所有元素名称添加前缀。

Nokogiri试图通过简单的redeclaring any namespace declarations found on the root of the document提供帮助 - 但是,正如您所看到的,在您的情况下,声明不在最外层元素上。

require "nokogiri"

@doc = Nokogiri::XML(File.read("mlive.xml"))
puts @doc.xpath('/MLiveDataLog/iec:Log/iec:Entry/@itemName', 'iec' => 'http://iec.ch/61400/ews/1.0/')

,结果将是

Turbine