我被困在一个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”元素下访问
答案 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