2012-02-18 14 views
1

ルート要素のID、LASTEDIT、EXPIRESS属性を取得できます。私はxpath、ruby、nokogiriを使用しています。しかし、それは仕事、任意のアイデアをdosent?ルートノードのxpath属性

たxPath querys:MY RUBY-SCRIPT IS HERE

<?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> 

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

答えて

5

I wan to fetch the ID, LASTEDITED, EXPIRESS attributes in the root element.

だけを使用私のXMLがどのように見えるか

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 

この:

/*/@id 

これは、XML文書の先頭要素のid属性を選択します。

/*/@lastEdited 

これは、XML文書の先頭要素のlastEdited属性を選択します。

/*/@expires 

これは、XML文書の最上位の要素のexpires属性を選択します。

あるいは、これらのすべての3つの属性が単一のXPath式で選択することができる: - このXSLT変換が上に塗布されたときに

<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> 

/*/@*[contains('|id|lastEdited|expires|', 
       concat('|', name(), '|') 
       ) 
    ] 

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

+0

@SHUMAcupcake:Uff ...私はXPath式を修正しました - 今しよう。 –

+0

申し訳ありませんが、どこで式を変更しましたか? – SHUMAcupcake

0

、あなたはこれを行うことができます:

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

XPathで検索する必要がある場合は、正しい名前空間を使用する必要があります。あなたのルートノードは、「P」の名前空間を持っているので、あなたはこれを行う必要があります。

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

お知らせお使いのノード名の前にされてp:

+0

私はpを削除しました:syntaxerror:未定義の名前空間接頭辞を取得しました。あなたは私のスクリプトを試しましたか?それはあなたのために働くかどうか、それは私のためにそれを提供することができます。このスクリプトは、もっと大きなものです。私はとても幸せになるでしょう、これは私を殺しているbeacuse。 – SHUMAcupcake

+0

そして私はそれをループする必要があります。私は同じXML構造を持つ4000の他のXMLファイルを取りそろえています。 – SHUMAcupcake

関連する問題