我需要编写一个 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
。
如何验证序列以及它是否是可选的?