マスター XML スキーマ テンプレートに対して XML 応答を検証する Ruby スクリプトを作成する必要があります。
たとえば、コントローラーのバックエンドからの XML 応答の例は次のとおりです。
<a>
<ID>TestID</ID>
<Name>NameTest</Name>
<Description/>
<DisplayName>DisplayNameTest</DisplayName>
</a>
そして、セクションの1つが次のような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
です。
シーケンスを検証する方法と、それがオプションかどうかを確認するにはどうすればよいですか?