0

マスター 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>

スキーマ テンプレートに対して検証したいことは次のとおりです。

  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

xml がある場合、xml スキーマxsd ファイルを使用して xml を検証しないのはなぜですか? 次に、たとえば Nokogiri を使用して xml を検証できます。 http://nokogiri.rubyforge.org/nokogiri/Nokogiri/XML/Schema.html . これは、独自のバリデータを作成するよりもはるかに簡単です。

Relax NG は別のスキーマ定義言語です。

「XML スキーマ テンプレート」は定義済みの言語で作成されていますか? (明らかな場合は、私の無知を許してください。)そうであれば、言語をサポートするライブラリは、スキーマを使用してxmlを検証できるはずです。そうでない場合は、xml スキーマに変換できる可能性があります

于 2012-06-22T05:43:32.970 に答える