2012-02-18 208 views
1

我想要獲取根元素中的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 
+0

看看這個答案:http://stackoverflow.com/questions/4690737/nokogiri-xpath-namespace-query – biscuit314 2012-02-18 17:20:51

回答

5

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('&#xA;', 
      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 
+0

偉大的答案,規範最後一個表達式。但我已經嘗試過,它不會打印它..東西是可疑的.. – SHUMAcupcake 2012-02-18 18:24:47

+0

@SHUMAcupcake:Uff ...我更正了XPath表達式 - 現在試試。 – 2012-02-18 18:32:16

+0

我很抱歉,但是您在哪裏更改了表達式,並且是否在某處放置了額外的文件 – SHUMAcupcake 2012-02-18 19:05:09

0

如果你只是想訪問根結點的文檔中,你可以這樣做:

root = doc.root 
root_id = root['id'] 
last_edited = root['lastEdited'] 

如果您需要使用XPath查找它,則需要使用正確的名稱空間。你的根節點有「P」的命名空間,所以你必須這樣做:

doc.xpath('/p:educationProvider/@id').first.value 

會注意到在您的節點名稱前面的p:

+0

我刪除了p:因爲我得到了一個語法錯誤:未定義的命名空間前綴。你有沒有試過我的腳本?它是否適合你,如果可以爲我提供幫助。這個腳本是一個更大的腳本..我會很高興,因爲這是殺了我。 – SHUMAcupcake 2012-02-19 17:20:48

+0

而且我需要循環它,因爲我正在使用相同的XML結構捕獲4000個其他XML文件。 – SHUMAcupcake 2012-02-19 17:22:52

相關問題