2014-01-28 85 views
0

我碰到,看起來像這樣的CSS驗證服務的XML響應的XML文件:如何分析利用引入nokogiri

{vextwarning=false, output=soap12, lang=en, warning=2, medium=all, profile=css3} 
<?xml version='1.0' encoding="utf-8"?> 
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> 
    <env:Body> 
     <m:cssvalidationresponse 
      env:encodingStyle="http://www.w3.org/2003/05/soap-encoding" 
      xmlns:m="http://www.w3.org/2005/07/css-validator"> 
      <m:uri>file:tmp.css</m:uri> 
      <m:checkedby>http://jigsaw.w3.org/css-validator/</m:checkedby> 
      <m:csslevel>css3</m:csslevel> 
      <m:date>2014-01-28T09:33:32Z</m:date> 
      <m:validity>false</m:validity> 
      <m:result> 
       <m:errors xml:lang="en"> 
        <m:errorcount>1</m:errorcount> 
       <m:errorlist> 
        <m:uri>file:tmp.css</m:uri> 
         <m:error> 
          <m:line>1</m:line> 
          <m:errortype>parse-error</m:errortype> 
          <m:context> asdf321 </m:context> 
          <m:errorsubtype> 
           exp 
          </m:errorsubtype> 
          <m:skippedstring> 
           123 
          </m:skippedstring> 
          <m:message> 
           Property bla doesn&#39;t exist : 
          </m:message> 
         </m:error> 
        </m:errorlist> 
       </m:errors> 
       <m:warnings xml:lang="en"> 
        <m:warningcount>0</m:warningcount> 
       </m:warnings> 
      </m:result> 
     </m:cssvalidationresponse> 
    </env:Body> 
</env:Envelope> 

我想用引入nokogiri解析它,但我完全被卡住。我知道如何使用Nokogiri解析CSS和東西,但是像這樣的XML對我來說是相當新的。

例如,我想要得到值m:validity,或者我想遍歷m:errors。請給我一些關於如何做到這一點的小提示。非常感謝。

+0

檢查出[薩翁紅寶石SOAP庫(HTTP:// savonrb的.com /);它可能會爲您簡化很多事情,包括抽象XML解析。 – maerics

+0

您應該從這裏開始:http://nokogiri.org/tutorials – matt

回答

1

看起來您正在處理SOAP消息,所以我建議使用Ruby的SOAP庫,如Savon

不過,如果你是從其他來源獲取XML文檔,那麼你可以使用名稱空間的XPath查詢,像這樣分析它:

class CssValidationResponse 
    attr_reader :valid, :errors 
    def initialize(xml) 
    doc = Nokogiri::XML(xml) 
    xmlns = { 'm' => 'http://www.w3.org/2005/07/css-validator' } 
    @valid = (doc.xpath('//m:validity', xmlns).text == 'true') 
    @errors = doc.xpath('//m:error/m:message', xmlns).map { |n| n.text.strip } 
    end 
end 

xml = read_my_xml_file 
validator = CssValidationResponse.new(xml) 
validator.valid # => false 
validator.errors # => ["Property bla doesn't exist :"]