0

我有一个 XML 文档:

<event>
    <type>SUBSCRIPTION_ORDER</type>
    <marketplace>
        <baseUrl>https://www.acme-marketplace.com</baseUrl>
        <partner>ACME</partner></marketplace>
    </marketplace>
    <creator>
        <email>admin@fakeco</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>admin@fakeco</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"

我究竟做错了什么?

4

2 回答 2

3

您有两个结束</marketplace>标记,它们是无效的 XML:

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

删除其中一个,Nokogiri 应该可以正常读取文件。

于 2012-08-23T13:08:53.473 回答
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>admin@fakeco</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>admin@fakeco</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 的人应该在将其发布之前通过有效性检查器运行它。事实上,它在 XML 世界中是不合格的并且被认为是非法的。

于 2012-08-23T17:48:05.363 回答