根节点的xpath属性
我想要获取根元素中的ID,LASTEDITED,EXPIRESS属性。我正在使用xpath,ruby和nokogiri。但它的工作,任何想法?根节点的xpath属性
XPATH querys:
doc.xpath('/educationProvider/@id').each do |id_node|
puts node.content
end
doc.xpath('/educationProvider/@lastEdited').each do |lastedited_node|
puts lastedited_node.content
end
doc.xpath('/educationProvider/@expires').each do |expires_node|
puts expires_node.content
end
这是我的XML看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<p:educationProvider xmlns:p="http://skolverket.se/education/provider/1.0" xmlns="http://skolverket.se/education/commontypes/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expires="2015-01-31" id="provider.uh.msb" lastEdited="2012-11-01T12:51:37" xsi:schemaLocation="http://skolverket.se/education/provider/1.0 educationProvider.xsd">
<p:vCard>
<VERSION/>
<FN/>
<N/>
<ADR>
<LOCALITY>KARLSTAD</LOCALITY>
<PCODE>651 81</PCODE>
</ADR>
<TEL>
<NUMBER>0771-240240</NUMBER>
</TEL>
<EMAIL>
<USERID>[email protected]</USERID>
</EMAIL>
<ORG>
<ORGNAME>Myndigheten för samhällsskydd och beredskap</ORGNAME>
</ORG>
<URL>http://www.msbmyndigheten.se</URL>
</p:vCard>
</p:educationProvider>
这里是我的RUBY脚本:
require 'rubygems'
require 'nokogiri'
require 'open-uri'
# parse the HTML document with all the links to the XML files.
doc = Nokogiri::HTML(open('http://testnavet.skolverket.se/SusaNavExport/EmilExporter?GetEvent&EMILVersion=1.1&NotExpired&EIAcademicType=UoH&SelectEP'))
# URLS - array
@urls = Array.new
#Get all XML-urls and save them in urls-array
doc.xpath('//a/@href').each do |links|
@urls << links.content
end
@id = Array.new
@lastedited = Array.new
@expires = Array.new
# loop all the url of the XML files
@urls.each do |url|
doc = Nokogiri::HTML(open(url))
# grab the content I want
doc.xpath('/educationProvider/@id').each do |id_node|
id_node.content
end
doc.xpath('/educationProvider/@lastEdited').each do |lastedited_node|
@lastedited << lastedited_node.content
end
doc.xpath('/educationProvider/@expires').each do |expires_node|
@expires << expires_node.content
end
end
#print it out
([email protected] - 1).each do |index|
puts "ID: #{@id[index]}"
puts "Lastedited: #{@lastedited[index]}"
puts "Expiress: #{@expires[index]}"
end
I wan to fetch the ID, LASTEDITED, EXPIRESS attributes in the root element.
只需使用 :
/*/@id
这将选择XML文档顶部元素的id
属性。
/*/@lastEdited
这会选择XML文档顶部元素的lastEdited
属性。
/*/@expires
这将选择XML文档顶部元素的expires
属性。
/*/@*[contains('|id|lastEdited|expires|',
concat('|', name(), '|')
)
]
XSLT - 基于验证:
可选地,所有这三个属性可以与单个XPath表达式选择
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select=
"/*/@*[contains('|id|lastEdited|expires|',
concat('|', name(), '|')
)
]">
<xsl:value-of select=
"concat('
',
name(),
' = ',
.
)"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
当该XSLT变换被应用上提供的XML文档:
<p:educationProvider xmlns:p="http://skolverket.se/education/provider/1.0" xmlns="http://skolverket.se/education/commontypes/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expires="2015-01-31" id="provider.uh.msb" lastEdited="2012-11-01T12:51:37" xsi:schemaLocation="http://skolverket.se/education/provider/1.0 educationProvider.xsd">
<p:vCard>
<VERSION/>
<FN/>
<N/>
<ADR>
<LOCALITY>KARLSTAD</LOCALITY>
<PCODE>651 81</PCODE>
</ADR>
<TEL>
<NUMBER>0771-240240</NUMBER>
</TEL>
<EMAIL>
<USERID>[email protected]</USERID>
</EMAIL>
<ORG>
<ORGNAME>Myndigheten för samhällsskydd och beredskap</ORGNAME>
</ORG>
<URL>http://www.msbmyndigheten.se</URL>
</p:vCard>
</p:educationProvider>
XPath表达式求值,并为每个选定的属性,它们的名称和值输出:
expires = 2015-01-31
id = provider.uh.msb
lastEdited = 2012-11-01T12:51:37
伟大的答案,规范最后一个表达式。但我已经尝试过,它不会打印它..东西是可疑的.. – SHUMAcupcake 2012-02-18 18:24:47
@SHUMAcupcake:Uff ...我更正了XPath表达式 - 现在试试。 – 2012-02-18 18:32:16
我很抱歉,但是您在哪里更改了表达式,并且是否在某处放置了额外的文件 – SHUMAcupcake 2012-02-18 19:05:09
如果你只是想访问根结点的文档中,你可以这样做:
root = doc.root
root_id = root['id']
last_edited = root['lastEdited']
如果您需要使用XPath查找它,则需要使用正确的名称空间。你的根节点有“P”的命名空间,所以你必须这样做:
doc.xpath('/p:educationProvider/@id').first.value
会注意到在您的节点名称前面的p:
。
我删除了p:因为我得到了一个语法错误:未定义的命名空间前缀。你有没有试过我的脚本?它是否适合你,如果可以为我提供帮助。这个脚本是一个更大的脚本..我会很高兴,因为这是杀了我。 – SHUMAcupcake 2012-02-19 17:20:48
而且我需要循环它,因为我正在使用相同的XML结构捕获4000个其他XML文件。 – SHUMAcupcake 2012-02-19 17:22:52
看看这个答案:http://*.com/questions/4690737/nokogiri-xpath-namespace-query – biscuit314 2012-02-18 17:20:51