在Ruby中针对自定义属性定义语言验证XML

时间:2012-06-22 04:13:29

标签: ruby xml

我需要编写一个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. 标签订单需要遵循架构模板中的标签订单。

  3. 如果其中任何一个条件不符合,则返回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中找到的所有标记。

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

1 个答案:

答案 0 :(得分:4)

如果您有xml,为什么不使用Xml Schema xsd文件来验证xml?然后你可以使用Nokogiri来验证xml。 http://nokogiri.rubyforge.org/nokogiri/Nokogiri/XML/Schema.html。这比编写自己的验证器容易得多。

Relax NG是另一种模式定义语言。

您的“XML架构模板”是否采用定义的语言? (如果显而易见,请原谅我的无知。)如果是这样,支持该语言的库应该能够使用模式验证xml。如果没有,您可以将其转换为xml架构