gpt4 book ai didi

xml - 如何通过 Ruby 中的 RELAX NG 验证 XML?

转载 作者:数据小太阳 更新时间:2023-10-29 01:47:00 26 4
gpt4 key购买 nike

REXML 模块似乎支持 RELAX NG validation ,但文档没有任何关于使用框架验证部分的真实信息。

您将如何使用 RELAX NG 模式验证 XML 文档?代码片段将是最有帮助的。 TIA!

最佳答案

好吧,我构建了一个程序,但结果并不好。

我的结论如下:

  1. rexml relaxng 模式解析可能不起作用。代码说明它是不完整的
  2. rexml pull 解析可能有效但很难判断
  3. 以上两项均未记录
  4. 你应该使用真正的 XML 库,比如 libxml

这是我的测试程序:test.rb

require 'rexml/validation/relaxng.rb'
require 'rexml/parsers/pullparser.rb'

# USAGE: ruby test.rb XML-FILE
xml = ARGV[0]

# schema must be a Relax NG XML (NOT compact / .rnc)
schema = File.new( "example.rng" )
validator = REXML::Validation::RelaxNG.new( schema )

# The structure the validator made, which should be a complex structure but isn't
validator.dump

xmlfile = File.new( xml )
parser = REXML::Parsers::PullParser.new( xmlfile )
while parser.has_next?
# Returns an PullEvent
e = parser.pull
# puts "Event ", e.inspect
validator.validate(e)
end

我制作了一些玩具示例 XML 文件和 RNG 文件,然后在 OSX 10.5.x 上试用(长线断开以使其可读):

$ /usr/bin/ruby test.rb good.xml 
< S.1 #{doc}, :end_document( ) >
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rexml/
validation/validation.rb:24:in `validate': Validation error. Expected:
:start_element( doc ) from < S.1 #:start_element( doc ), {head}, {body},
:end_element( ), :end_document( ) > but got "doc"( )
(REXML::Validation::ValidationException)
from test.rb:20

(我对 1.9 也一样)

所以,几乎是失败。

(我本可以进一步优化测试程序以使用 add_listener 但这似乎不值得)

关于xml - 如何通过 Ruby 中的 RELAX NG 验证 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/913489/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com