2016-05-17 14 views
1

私はRubyスクリプトを使ってPostman SOAP POST呼び出しを作成し、次にNokogiriを使ってXML応答を解析しています。私は、ポストマンからの完全なSOAP呼び出し応答を取る私のエディタにコピーして、手動でXML本体を取り、それをデコードし、それをオンラインでフォーマットするとき、私は成功し、次の鋸山スクリプトを使用することができるよ:RubyでNokogiriを使ってSOAP呼び出しからXML本体を操作する

doc = Nokogiri::XML(File.open("response.xml")) 

property_ids = [] 

doc.css('Property').each do |property| 
    puts "Property ID: #{property['PropertyId']}" 
    property_ids << property['PropertyId'] 
end 


property_ids.each_with_index do |property_id, index| 
    puts "index: #{index}" 
    puts "property id: #{property_id}" 
end 

I私はスクリプトでポストマンコールのRubyのスニペットを含めたい場合に問題にされて実行します。

require 'nokogiri' 
require 'uri' 
require 'net/http' 
require 'openssl' 


url = URI("https://esite.thelyndco.com/AmsiWeb/eDexWeb/esite/leasing.asmx") 

http = Net::HTTP.new(url.host, url.port) 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE 

request = Net::HTTP::Post.new(url) 
request["content-type"] = 'application/soap+xml' 
request["cache-control"] = 'no-cache' 
request["postman-token"] = '916e3f3d-11ca-e8cf-2066-542b009a281d' 
request.body = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">\r\n <soap12:Body>\r\n <GetPropertyList xmlns=\"http://tempuri.org/\">\r\n  <UserID>updater</UserID>\r\n  <Password>[password]</Password>\r\n  <PortfolioName>[portfolio name]</PortfolioName>\r\n  <XMLData> \r\n</XMLData>\r\n </GetPropertyList>\r\n </soap12:Body>\r\n</soap12:Envelope>" 

response = http.request(request) 

doc = Nokogiri::XML(response.body) 
# doc = Nokogiri::XML(File.open("full-response.xml")) 
# doc.at('GetPropertyListResponse').text 

私はSOAPエンベロープとの完全なSOAPレスポンスを取得し、それを処理することができるされてやりたいです私のスクリプトはカットアンドペーストする必要はありません。オンラインXMLフォーマッタを使用して手動でデコードし、フォーマットする。

私はStack Overflowから試した2行をコメントアウトしました。 Nokogiriを使用してXML本体をデコードしてフォーマットすることはできますか、SOAPエンベロープを解析することは可能ですか?

編集:

私が取っ意味XMLをデコードすることにより:

<GetPropertyListResult>&lt;Properties&gt;&lt;Property PropertyId="11A" PropertyName1="1111 Austin Hwy" PropertyName2="" PropertyAddrLine1="The 1111" PropertyAddrLine2="1111 Austin Highway" PropertyAddrLine3="" PropertyAddrLine4="" PropertyAddrCity="San Antonio" PropertyAddrState="TX" PropertyAddrZipCode="78209" PropertyAddrCountry="" PropertyAddrEmail="" RemitToAddrLine1="The 1111" RemitToAddrLine2="1111 Austin Highway" RemitToAddrLine3="" RemitToAddrLine4="" RemitToAddrCity="San Antonio" RemitToAddrState="TX" RemitToAddrZipCode="78209" RemitToAddrCountry="" LiveDate="2013-12-04T00:00:00" MgrOffPhoneNo="210-804-1100" MgrFaxNo="" MgrSalutation="" MgrFirstName="" MgrMiName="" MgrLastName="" MonthEndInProcess="N"&gt;&lt;Amenity PropertyId="11A" 

をし、このonline XML decoder使用にそれをデコード:XML formatterので、ネストされた要素を通してそれを実行し、その後

<GetPropertyListResult><Properties><Property PropertyId="11A" PropertyName1="1111 Austin Hwy" PropertyName2="" PropertyAddrLine1="The 1111" PropertyAddrLine2="1111 Austin Highway" PropertyAddrLine3="" PropertyAddrLine4="" PropertyAddrCity="San Antonio" PropertyAddrState="TX" PropertyAddrZipCode="78209" PropertyAddrCountry="" PropertyAddrEmail="" RemitToAddrLine1="The 1111" RemitToAddrLine2="1111 Austin Highway" RemitToAddrLine3="" RemitToAddrLine4="" RemitToAddrCity="San Antonio" RemitToAddrState="TX" RemitToAddrZipCode="78209" RemitToAddrCountry="" LiveDate="2013-12-04T00:00:00" MgrOffPhoneNo="210-804-1100" MgrFaxNo="" MgrSalutation="" MgrFirstName="" MgrMiName="" MgrLastName="" MonthEndInProcess="N"><Amenity PropertyId="11A" 

を読みやすくするためにインデントされています。

+0

動詞「復号」と「形式」は、この場合には何を意味するのですか? Rubyコードを使って実際に何をしていますか? –

+0

@MichaelGaskill、xmlの解読と書式設定の明確化のために編集された質問。 – phizzy

答えて

1

あなたはXMLをデコードおよびフォーマットするために、このコードを使用することができます:設け

require "nokogiri" 

XML_CHAR_ENTITIES = { 
    "lt" => "<", 
    "gt" => ">", 
    "amp" => "&", 
    "num" => "#", 
    "comma" => "," 
} 

xsl =<<XSL 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="/"> 
    <xsl:copy-of select="."/> 
    </xsl:template> 
</xsl:stylesheet> 
XSL 


xml = '<GetPropertyListResult>&lt;Properties&gt;&lt;Property PropertyId="11A" PropertyName1="1111 Austin Hwy" PropertyName2="" PropertyAddrLine1="The 1111" PropertyAddrLine2="1111 Austin Highway" PropertyAddrLine3="" PropertyAddrLine4="" PropertyAddrCity="San Antonio" PropertyAddrState="TX" PropertyAddrZipCode="78209" PropertyAddrCountry="" PropertyAddrEmail="" RemitToAddrLine1="The 1111" RemitToAddrLine2="1111 Austin Highway" RemitToAddrLine3="" RemitToAddrLine4="" RemitToAddrCity="San Antonio" RemitToAddrState="TX" RemitToAddrZipCode="78209" RemitToAddrCountry="" LiveDate="2013-12-04T00:00:00" MgrOffPhoneNo="210-804-1100" MgrFaxNo="" MgrSalutation="" MgrFirstName="" MgrMiName="" MgrLastName="" MonthEndInProcess="N"&gt;&lt;Amenity PropertyId="11A"></GetPropertyListResult>' 

xml = xml.gsub(/&(\w+);/) do |match| 
    char_entity = XML_CHAR_ENTITIES[$1] 
    char_entity ? char_entity : match 
end 

doc = Nokogiri::XML(xml) 
xslt = Nokogiri::XSLT(xsl) 
xml = xslt.transform(doc) 

puts "#{xml}" 

XMLは不完全であったので、この終端文字列は、それを解析することを可能にするために添付された:></GetPropertyListResult>

XML_CHAR_ENTITIESを提供エンコードされた文字列をデコードされた文字列にハッシュし、W3 Character Entity Reference Chartに記載されているような他のXML文字エンティティを含むように容易に拡張することができます。

XSLは、Nokogiriで出力するためにXMLをフォーマットするために使用される埋め込みスタイルシートです。

XML文字エンティティのデコードは、ブロックオプションを使用してString#gsubコールで行われます。その後、XMLはNokogiriによって正常に解析されます。 XMLが解析されると、Nokogiri XSLT変換を使用してフォーマットされます。

このコードの出力は次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<GetPropertyListResult> 
    <Properties> 
    <Property PropertyId="11A" PropertyName1="1111 Austin Hwy" PropertyName2="" PropertyAddrLine1="The 1111" PropertyAddrLine2="1111 Austin Highway" PropertyAddrLine3="" PropertyAddrLine4="" PropertyAddrCity="San Antonio" PropertyAddrState="TX" PropertyAddrZipCode="78209" PropertyAddrCountry="" PropertyAddrEmail="" RemitToAddrLine1="The 1111" RemitToAddrLine2="1111 Austin Highway" RemitToAddrLine3="" RemitToAddrLine4="" RemitToAddrCity="San Antonio" RemitToAddrState="TX" RemitToAddrZipCode="78209" RemitToAddrCountry="" LiveDate="2013-12-04T00:00:00" MgrOffPhoneNo="210-804-1100" MgrFaxNo="" MgrSalutation="" MgrFirstName="" MgrMiName="" MgrLastName="" MonthEndInProcess="N"> 
     <Amenity PropertyId="11A"/> 
    </Property> 
    </Properties> 
</GetPropertyListResult> 
関連する問題