0

別のWebサイトからXMLを返すためにrest-clientを使用しており、Nokogiriを使用してそれを解析しようとしています。XMLは次のようになります。

<?xml version="1.0" encoding="UTF-8"?> ... 
<MXAUTOKESet>
  <AUTOKEY>
    <AUTOKEYID>27</AUTOKEYID> 
    <AUTOKEYNAME>WORKORDERNUM</AUTOKEYNAME> 
    <ORGID>xxxx</ORGID> 
    <PREFIX>12-</PREFIX> 
    <SEED>38979</SEED> 
    ...

「PREFIX」と「SEED」の番号を抽出したい。

私のビューコードは次のようになります。

<% xml_data = RestClient.get "URL (sorry can't display it in this question)" %>
<%= xml_doc  = Nokogiri::XML(xml_data)%>

2行目は、返されたXMLをページに表示しているため、rest-clientが機能していることはわかっていますが、解析されたXMLにアクセスする方法がわかりません。


UPDATE1:

creationDateTime以下を使用して、XMLヘッダーから抜け出すことができました。しかし、それでもSEED値を取得できません。

<%= doc = Nokogiri::XML(xml_data)%>    
<h4>Creation Date</h4>
<% root = doc.root %>
<%= root["creationDateTime"] %>
<h4>SEED</h4>
<%= seed = root.xpath("SEED").text %>

また

 <%= seed = doc.xpath("//SEED").inner_text %>
4

2 に答える 2

2

コードにいくつか問題があるので、次のようにします。

このコードから始めて:

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<?xml version="1.0" encoding="UTF-8"?>
<MXAUTOKESet>
  <AUTOKEY>
    <AUTOKEYID>27</AUTOKEYID> 
    <AUTOKEYNAME>WORKORDERNUM</AUTOKEYNAME> 
    <ORGID>xxxx</ORGID> 
    <PREFIX>12-</PREFIX> 
    <SEED>38979</SEED> 
EOT

puts doc.to_xml

私はこの出力を取得し、Nokogiriが開いたタグを閉じるために少し修正を行い、XMLの適度に正しいチャンクを確保したことを示しています。

<?xml version="1.0" encoding="UTF-8"?>
<MXAUTOKESet>
  <AUTOKEY>
    <AUTOKEYID>27</AUTOKEYID>
    <AUTOKEYNAME>WORKORDERNUM</AUTOKEYNAME>
    <ORGID>xxxx</ORGID>
    <PREFIX>12-</PREFIX>
    <SEED>38979</SEED>
</AUTOKEY></MXAUTOKESet>

xpathXPathアクセサーを期待し、ノードの配列のようなNodeSetを返します。

doc.xpath("//SEED").class
=> Nokogiri::XML::NodeSet
doc.xpath("//SEED")
=> [#<Nokogiri::XML::Element:0x3fdf890e3208 name="SEED" children=[#<Nokogiri::XML::Text:0x3fdf890e3000 "38979">]>]

問題は、、、xpathおよびそれにcss対応するものが、ドキュメント内で見つかったターゲットのすべてのオカレンスを返すことです。これは、2つ以上の「SEED」タグがある場合は必要ありません。代わりに、最初に見つかったオカレンスを返すatorまたはat_xpathorが必要です。XPathよりも理解しやすいので、最初のテストには(または)とCSSat_cssを使用することをお勧めします。atsearch

at使用およびCSSに変換:

doc.at("SEED").class
=> Nokogiri::XML::Element
doc.at("SEED")
=> #<Nokogiri::XML::Element:0x3fdf890e3208 name="SEED" children=[#<Nokogiri::XML::Text:0x3fdf890e3000 "38979">]>

「Nokogiri::XML :: Element」が返されたことに注意してください。これは、 (AKA doc.at("SEED"))のNodeSet(AKA配列)ではなく、Nokogiriがノードを記述する方法です。xpathsearch

ノードができたら、テキストを取得するのは簡単です。

doc.at("SEED").text
=> "38979"

小さなXMLスニペットを前提として、両方の値を取得して2つの変数に割り当てる方法は次のとおりです。

seed, prefix = %w[SEED PREFIX].map{ |t| doc.at(t).text }
=> ["38979", "12-"]
于 2013-02-27T06:14:55.167 に答える
1

コードの最後の行、、puts doc.xpath("//SEED").inner_textが機能するはずです。実際のXMLには名前空間がありますか?含まれている場合は、代わりにこれを試してください。puts doc.css("SEED").inner_text

于 2013-02-27T02:07:03.027 に答える