Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby XML处理器如何处理未解析的实体?_Ruby_Xml_Nokogiri - Fatal编程技术网

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

Ruby XML处理器如何处理未解析的实体?,ruby,xml,nokogiri,Ruby,Xml,Nokogiri,根据我到目前为止所做的研究,外部未解析的XML实体用于引用不一定是XML的数据。这提供了一种传输非XML数据的方法。因此,未解析的实体仅在实体属性中取消引用,因为取消引用的值将不符合XML文档的结构 这一切都是有道理的,但我不知道何时/什么时候取消引用实体定义中声明的目标文件。XML解析器本身是否访问目标文件、提取数据,然后将其放入XML文档中?或者客户端(即XML文档的使用者)是否访问数据并相应地对其进行操作 诚然,问题可能是我使用的XML处理器(Nokogiri::Version#=>“1.

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

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

诚然,问题可能是我使用的XML处理器(
Nokogiri::Version#=>“1.6.8.1”
)配置不正确,但解析的外部实体被成功取消引用

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

托管的外部DTD文件@


XML文件


&任意文本;
诺科吉里产量


一些文本
我想我还是在这一点上张贴我粗糙的马具为好:

Ruby代码

#/usr/bin/ruby
需要“nokogiri”
def打印错误(文档)
如果文档出错!=[]
ban=“警告:检测到分析错误”
放
放置“-”*ban.bytesize
禁止
放置“-”*ban.bytesize
放置文档错误
放置“-”*ban.bytesize
放
结束
结束
#XML解析器选项(Nokogiri选项)
options=Nokogiri::XML::ParseOptions.new()
选项。恢复
options.dtdload
选项1.noent
options.noblanks
options.dtdvalid#取消注释以强制DTD验证
#外部DTD示例
外部dtd=%`
&任意文本;
`
doc=Nokogiri::XML(ext_dtd,nil,nil,options)
打印错误(文档)
放博士
打印错误(文档)
<!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 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>
<?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>
#!/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)