Ru在XML Fie中看到了ribute c和r

问题描述 投票:0回答:1

这是xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
        <ns1:putResponse
            xmlns:ns1="urn:DmsManagerClient">
            <result xsi:type="xsd:string">
                <?xml version="1.0" encoding="ISO-8859-1"?>
                <MESSAGE ID="11c73b9e-687c-4300-baba-b743c26f7c83" TYPE="CUSDMS">
                    <DELIVERY>
                        <FROM>
                            <SENDER>0072000</SENDER>
                            <SERVICE>eService</SERVICE>
                            <DATE>2019-03-08T12:27:25</DATE>
                        </FROM>
                        <TO>
                            <DEALER DEALERCODE="0072000" MARKETCODE="1000"/>
                        </TO>
                    </DELIVERY>
                    <CONTENT>
                        <dms:ComplexResponse ErrorCode="430" ErrorDescription="null :  PrivacyUE Mancante" Return="false"
                            xmlns:dms="http://dmsmanagerservice">
                            <dms:Element Name="DMSVERSION">2.7</dms:Element>
                        </dms:ComplexResponse>
                    </CONTENT>
                </MESSAGE>
            </result>
        </ns1:putResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我正在使用Ruby进行编码,我使用了Nokogiri和方法xpath来推断文件的“内容”

这是代码:

def extrapolate_error(xml)
  doc = Nokogiri::XML(File.open(xml))
  doc.xpath('//CONTENT')

end

这就是结果:

[#<Nokogiri::XML::Element:0x1c5ba78 name="CONTENT" children=[
   #<Nokogiri::XML::Text:0x1c5b940 "\n">, 
   #<Nokogiri::XML::Element:0x1c5b8bc name="ComplexResponse" namespace=#<Nokogiri::XML::Namespace:0x1c5b88c prefix="dms" href="http://dmsmanagerservice"> 
     attributes=[
       #<Nokogiri::XML::Attr:0x1c5b874 name="ErrorCode" value="430">, 
       #<Nokogiri::XML::Attr:0x1c5b868 name="ErrorDescription" value="null :  PrivacyUE Mancante">, 
       #<Nokogiri::XML::Attr:0x1c5b85c name="Return" value="false">] 
       children=[#<Nokogiri::XML::Text:0x1c5b118 "\n">, 
                 #<Nokogiri::XML::Element:0x1c5b094 name="Element" namespace=#<Nokogiri::XML::Namespace:0x1c5b88c prefix="dms" href="http://dmsmanagerservice"> 
             attributes=[#<Nokogiri::XML::Attr:0x1c5b058 name="Name" value="DMSVERSION">] 
             children=[#<Nokogiri::XML::Text:0x1c5abe4 "2.7">]>, 
                     #<Nokogiri::XML::Text:0x1c5aaac "\n">]>,
                     #<Nokogiri::XML::Text:0x1c5a974 "\n">]>]

现在我需要输入它并选择一些属性。

具体我需要这个:

name =“ErrorCode”value =“430”

name =“ErrorDescription”value =“null:PrivacyUE Mancante”

我不知道该怎么办。你能帮助我吗?

ruby nokogiri
1个回答
1
投票

假设dms命名空间始终相同,以下内容适用于您

doc.xpath('//CONTENT/dms:ComplexResponse', dms: 'http://dmsmanagerservice')
    .xpath('@ErrorCode | @ErrorDescription')
    .each_with_object({}) do |e,obj| 
      obj[e.name] = e.text
    end
#=> {"ErrorCode"=>"430", "ErrorDescription"=>"null :  PrivacyUE Mancante"}

你已经理解了如何// CONTENT所以我们使用dms:ComplexResponse来深入导航,但由于这是命名空间,我们必须提供命名空间参考,例如dms: 'http://dmsmanagerservice'

然后我们选择我们感兴趣的@ErrorCode@ErrorDescription属性。

XPath中,管道|意味着UNION(想想AND)所以我们想要选择两者。

然后我们只是使用Hash作为关键而name作为值来构建text

XPath Cheatsheet - 如果您需要其他参考,请使用有用的资源

更新

你询问了条件,所以这就是我的建议

ndoc = Nokogiri::XML(doc)
namespaces = ndoc.collect_namespaces

response = ndoc.xpath("//CONTENT/dms:ComplexResponse", namespaces)

if response.xpath("self::node()[@ErrorCode != '' and @ErrorDescription != '']").any?
  response.xpath("@ErrorCode | @ErrorDescription")
  .each_with_object({}) do |e,obj| 
    obj[e.name] = e.text
  end
else
  response.xpath('dms:Element/@Name | dms:Element/text()',namespaces)
    .each_slice(2)
    .map {|s| s.map(&:text)}.to_h
end

这将检查是否存在ErrorCode和ErrorDescription,如果是,则检查是否与最初提议的Hash一样。如果不然后它返回所有dms:元素作为Hash所以{"DMSVERSION"=>"2.7"}在这种情况下Functional Example

© www.soinside.com 2019 - 2024. All rights reserved.