根据我迄今为止所做的研究,外部未解析的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)