我需要编写一个Ruby脚本来验证针对主XML模式模板的XML响应。
比如说,来自控制器后端的示例XML响应是:
<a>
<ID>TestID</ID>
<Name>NameTest</Name>
<Description/>
<DisplayName>DisplayNameTest</DisplayName>
</a>
我有一个XML架构模板,其中一个部分如下:
<Object name = "a">
<property name = "ID" optional="true"/>
<property name = "Name" optional="true"/>
<property name="visibility" />
<property name="Description" optional="true" />
<property name="DisplayName" optional="true" />
</Object>
我想根据架构模板验证的是:
如果可选属性标记设置为true,则此标记是必需的,并且必须存在于响应中。
标签订单需要遵循架构模板中的标签订单。
如果其中任何一个条件不符合,则返回false。
我现在拥有的一些代码(可能有很多方法可以做到这一点):
response_xml = REXML::Document.new(response_xml)
response_xml_root = response_xml.root.name.to_s.chomp
xml_api_meta = REXML::Document.new(File.read('Schema.xml'))
response_xml_array = response_xml.root.elements.to_a.collect { |e| e.name }
@api_meta_array = []
xml_api_meta.elements.each('ApiMeta/Object') do |element|
if element.attributes["name"] == response_xml_root
element.elements.each do |children|
@api_meta_array.push children.attributes["name"]
end
end
end
我的想法是从响应XML中收集所有标记名称并将它们推送到数组@response_xml_array
中,并对模式执行相同的操作并推送在数组@api_meta_array
中找到的所有标记。
如何验证序列以及序列是否可选?
答案 0 :(得分:4)
如果您有xml,为什么不使用Xml Schema xsd文件来验证xml?然后你可以使用Nokogiri来验证xml。 http://nokogiri.rubyforge.org/nokogiri/Nokogiri/XML/Schema.html。这比编写自己的验证器容易得多。
Relax NG是另一种模式定义语言。
您的“XML架构模板”是否采用定义的语言? (如果显而易见,请原谅我的无知。)如果是这样,支持该语言的库应该能够使用模式验证xml。如果没有,您可以将其转换为xml架构