2

XML ファイルを読み取り、Ruby on Rails の Nokogiri を使用して SOAP リクエスト ボディを生成する必要があります。

生成する必要があるリクエスト本文は次のとおりです。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:c2="http://c2_0.customer.webservices.csx.dtv.com/">
  <soapenv:Header>
    <soapenv:Body>
      <c2:getCustomer>
        <customerId>10</customerId>
        <UserId>adminUser</UserId>
      </c2:getCustomer>
    </soapenv:Body>
  </soapenv:Header>
</soapenv:Envelope>

私はこのコードを使用しています:

require 'nokogiri'

doc = Nokogiri::XML(File.open('p_l_s.xml')) 

wsID =doc.xpath('//transaction:WsID' , 'transaction'  => 'http://www.nrf-arts.org/IXRetail/namespace/').inner_text

builder = Nokogiri::XML::Builder.new do |xml|
  xml.Envelope("xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/",
               "xmlns:c2" => "http://c2_0.customer.webservices.csx.dtv.com/") do
      xml.parent.namespace = xml.parent.namespace_definitions.first
      xml['soapenv'].Header {
        xml.Body {
          xml['c2'].getCustomer{
            #xml.remove_namespaces!     
            xml.customerId wsID
            xml.UserId "adminUser"    
        }
      }
    }
  end
end
puts builder.to_xml

そして、Ubuntu のターミナルから実行すると、次のようになります。

<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:c2="http://c2_0.customer.webservices.csx.dtv.com/">
  <soapenv:Header>
    <soapenv:Body>
      <c2:getCustomer>
        <c2:customerId>10</c2:customerId>
        <c2:UserId>adminUser</c2:UserId>
      </c2:getCustomer>
    </soapenv:Body>
  </soapenv:Header>
</soapenv:Envelope>

c2XML 要素の名前空間を取得しますがcustomerIdUserIdこれはこれから呼び出す WSDL ファイルで呼び出すメソッドには必要ありません。

4

2 に答える 2

1

次のコードを使用して、必要な出力を生成できました。

builder = Nokogiri::XML::Builder.new do |xml|
  xml.Envelope("xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/",
               "xmlns:c2" => "http://c2_0.customer.webservices.csx.dtv.com/") do
    xml.parent.namespace = xml.parent.namespace_definitions.first
    xml.Header {
      xml.Body {
        xml.getCustomer {     
          xml.customerId {
            xml.parent.content=(wsID)
            xml.parent.namespace = xml.parent.namespace_definitions.first
          }
          xml.UserId{
            xml.parent.content=("adminUser")
            xml.parent.namespace = xml.parent.namespace_definitions.first
          } 
          xml.parent.namespace = xml.parent.namespace_scopes[1]
        }
      }
    }
  end
end
puts builder.to_xml

「getCustomer」に到達するまで、名前空間を明示的に設定する必要はありません。「content」メソッドと「namespace_definition」メソッドを組み合わせて、子ノードの名前空間とコンテンツを指定できます。これにより、探していたものが出力されます。

Builder の Nogokiri ページ: http://nokogiri.org/Nokogiri/HTML/Builder.htmlおよび Node: http://nokogiri.org/Nokogiri/XML/Node.htmlは非常に便利で、より多くの光を当てるのに役立つことを願っています。これについてあなたのために。

于 2013-08-09T02:49:31.810 に答える