2012-08-23 30 views
0

我有一个XML文档:引入nokogiri不加载解析整个XML文件

<event> 
    <type>SUBSCRIPTION_ORDER</type> 
    <marketplace> 
     <baseUrl>https://www.acme-marketplace.com</baseUrl> 
     <partner>ACME</partner></marketplace> 
    </marketplace> 
    <creator> 
     <email>[email protected]</email> 
     <firstName>Alice</firstName> 
     <lastName>Hacker</lastName> 
     <openId>https://www.acme-marketplace.com/openid/id/a11a7918-bb43-4429-a256-f6d729c71033</openId> 
     <uuid>a11a7918-bb43-4429-a256-f6d729c71033</uuid> 
    </creator> 
    <payload> 
     <company> 
      <uuid>d15bb36e-5fb5-11e0-8c3c-00262d2cda03</uuid> 
      <email>[email protected]</email> 
      <name>Fake Co.</name> 
      <phoneNumber>1-415-555-1212</phoneNumber> 
      <website>fakeco</website> 
     </company> 
     <order> 
      <editionCode>BASIC</editionCode> 
      <item> 
       <quantity>10</quantity> 
       <unit>USER</unit> 
      </item> 
     </order> 
    </payload> 
</event> 

,我得到了奇怪的结果,当我引入nokogiri加载:

1.9.3p194 :056 > doc = Nokogiri::XML(File.open("test.xml")).to_s 
=> "<?xml version=\"1.0\"?>\n<event>\n <type>SUBSCRIPTION_ORDER</type>\n <marketplace>\n  <baseUrl>https://www.acme-marketplace.com</baseUrl>\n  <partner>ACME</partner></marketplace>\n </event>\n" 

我在做什么错?

回答

3

你有两个关</marketplace>标签,这是无效的XML:

<partner>ACME</partner></marketplace> 
</marketplace> 

删除其中之一,并引入nokogiri应该读取文件的罚款。

+0

哦,我也刚刚意识到这一点..我应该打开它的一些语法 - 荧光笔:-)。无论如何感谢 – Ch4rAss

+0

不客气!这很容易找到,只要看看Nokogiri停在哪里,就会发现问题所在。 –

1

如果你解析你的XML转换为Nokgiri :: XML文档:

doc = Nokogiri::XML(<<EOT) 
<event> 
    <type>SUBSCRIPTION_ORDER</type> 
    <marketplace> 
     <baseUrl>https://www.acme-marketplace.com</baseUrl> 
     <partner>ACME</partner></marketplace> 
    </marketplace> 
    <creator> 
     <email>[email protected]</email> 
     <firstName>Alice</firstName> 
     <lastName>Hacker</lastName> 
     <openId>https://www.acme-marketplace.com/openid/id/a11a7918-bb43-4429-a256-f6d729c71033</openId> 
     <uuid>a11a7918-bb43-4429-a256-f6d729c71033</uuid> 
    </creator> 
    <payload> 
     <company> 
      <uuid>d15bb36e-5fb5-11e0-8c3c-00262d2cda03</uuid> 
      <email>[email protected]</email> 
      <name>Fake Co.</name> 
      <phoneNumber>1-415-555-1212</phoneNumber> 
      <website>fakeco</website> 
     </company> 
     <order> 
      <editionCode>BASIC</editionCode> 
      <item> 
       <quantity>10</quantity> 
       <unit>USER</unit> 
      </item> 
     </order> 
    </payload> 
</event> 
EOT 

然后检查文档的errors方法,你会看到:

doc.errors 
[ 
    [0] #<Nokogiri::XML::SyntaxError:0x100a6dbb8 
     attr_reader :code = 76, 
     attr_reader :column = 19, 
     attr_reader :domain = 1, 
     attr_reader :file = nil, 
     attr_reader :int1 = 1, 
     attr_reader :level = 3, 
     attr_reader :line = 6, 
     attr_reader :str1 = "event", 
     attr_reader :str2 = "marketplace", 
     attr_reader :str3 = nil 
    >, 
    [1] #<Nokogiri::XML::SyntaxError:0x100a6daa0 
     attr_reader :code = 5, 
     attr_reader :column = 5, 
     attr_reader :domain = 1, 
     attr_reader :file = nil, 
     attr_reader :int1 = 0, 
     attr_reader :level = 3, 
     attr_reader :line = 7, 
     attr_reader :str1 = nil, 
     attr_reader :str2 = nil, 
     attr_reader :str3 = nil 
    > 
] 

这就是引入nokogiri告诉你有关的问题与文件。您可以到反应只是足够使用:

if (!doc.errors.empty?) 
    ... 
end 

它试图从因为RECOVER国旗在parse步骤中设定的错误中恢复,但也有一些情况下,它不能修复,如一倍闭幕标签。在Nokogiri能够理解之前,您需要先进行飞行前检查并修复以清理文档。不幸的是,并不是所有的XML都能正确生成,并且创建它的人应该先将其通过有效性检查程序运行,然后再将其发布到那里。因为它在XML世界中不符合规定并被认为是非法的。