0

我需要编写一个 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>

我要针对架构模板验证的事情是:

  1. 如果可选属性标记设置为 true,则此标记是必需的,并且必须存在于响应中。

  2. 标签顺序需要遵循架构模板中的标签顺序。

如果任一条件不符合,则返回 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

如何验证序列以及它是否是可选的?

4

1 回答 1

4

If you have xml, why don't use use an Xml Schema xsd file to validate the xml? Then you can use Nokogiri for instance to validate the xml. http://nokogiri.rubyforge.org/nokogiri/Nokogiri/XML/Schema.html . This is much easier than writing your own validator.

Relax NG is another schema definition language.

Is your "XML schema template" in a defined language? (Forgive my ignorance if it is obvious.) If so, libraries supporting the language should be able to validate xml using the schema. If not, you might be able to translate it to xml schema

于 2012-06-22T05:43:32.970 回答