XML处理器如何处理未解析的实体?

时间:2017-03-22 14:40:10

标签: ruby xml nokogiri

根据我迄今为止所做的研究,外部未解析的XML实体用于引用不一定是XML的数据。这提供了一种传输非XML数据的方法。因此,未解析的实体仅在实体属性中取消引用,因为取消引用的值将不符合XML文档的结构。

这一切都有意义,但我在实体定义中声明的目标文件何时/什么解除引用时会丢失。 XML解析器本身是否访问目标文件,提取数据,然后将其放入XML文档中?或者客户端(即XML文档的使用者)是否访问数据并相应地对其进行操作?

不可否认,问题可能是我使用的XML处理器(Nokogiri::Version #=> "1.6.8.1")配置不正确,但解析后的外部实体已成功解除引用。

以下是一些支持我的问题的代码:

托管@ http://127.0.0.1:81/some.dtd:

的外部DTD文件
<!ELEMENT rootsies ANY>
<!ELEMENT arbitrary ANY>
<!ELEMENT viewer EMPTY>
<!ATTLIST viewer source ENTITY #REQUIRED>
<!ENTITY gif_source SYSTEM "file:///var/www/html/some.gif" NDATA gif>
<!NOTATION gif SYSTEM "text viewer">
<!ENTITY arbitrary_text "some text">

XML文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE rootsies SYSTEM "http://127.0.0.1:81/some.dtd">
<rootsies>
    <viewer source="gif_source"/>
    <arbitrary>&arbitrary_text;</arbitrary>
</rootsies>

Nokogiri输出

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE rootsies SYSTEM "http://127.0.0.1:81/some.dtd">
<rootsies>
    <viewer source="gif_source"/>
    <arbitrary>some text</arbitrary>
</rootsies>

我想我此时也可以发布我粗略的安全带:

Ruby代码

#!/usr/bin/ruby

require 'nokogiri'

def print_errors(doc)

    if doc.errors != []

        ban = "Warning: Parse errors detected"

        puts
        puts "-" * ban.bytesize
        puts ban
        puts "-" * ban.bytesize
        puts doc.errors
        puts "-" * ban.bytesize
        puts

    end

end

# XML Parser Options (Nokogiri Options)
options = Nokogiri::XML::ParseOptions.new()
options.recover
options.dtdload
options.noent
options.noblanks
options.dtdvalid # Uncomment to enforce DTD validation

# External DTD Example
ext_dtd = %`<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE rootsies SYSTEM "http://127.0.0.1:81/some.dtd">
<rootsies>
    <viewer source="gif_source"/>
    <arbitrary>&arbitrary_text;</arbitrary>
</rootsies>`

doc = Nokogiri::XML(ext_dtd, nil, nil, options)

print_errors(doc)

puts doc

print_errors(doc)

0 个答案:

没有答案