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 である2 つの終了タグがあります。

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

それらの 1 つを削除すると、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
    >
]

ノコギリが文書の問題点を教えてくれました。以下を使用して、簡単に対応できます。

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

RECOVERステップでフラグが設定されているため、エラーから回復しようとしparseますが、終了タグが二重になっているなど、修正できない場合があります。Nokogiri がドキュメントを理解できるようになる前に、フライト前のチェックと修正を行ってドキュメントをクレンジングする必要があります。残念ながら、すべての XML が正しく生成されるわけではありません。XML を作成した人は、公開する前に有効性チェッカーを実行する必要があります。このままでは、XML の世界では不適合であり、違法と見なされます。

于 2012-08-23T17:48:05.363 に答える