2

これらの3つが同じになるようにXmlステートメントで同等性を定義する方法はありますか(空白と引数およびタグの順序を無視します)?

1:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com</groupId>
  <url>http://maven.apache.org</url>
</project>

2:

<project>
  <modelVersion>4.0.0</modelVersion>
  <url>http://maven.apache.org</url>
  <groupId>com</groupId>
</project>

3:

<project>
    <modelVersion>4.0.0</modelVersion>
    <url>http://maven.apache.org</url>
    <groupId>com</groupId>
</project>

たとえば、にインスタンスがないため、 xmlは役に立ちません。EqContent

また、xml-conduitも使用できません。これは、Elementにすべてのノード要素が含まれているためListです。また、空白に敏感です。

使用できるライブラリはたくさんありますが、xml使用HXTできるものを見つけるのは困難です。

4

3 に答える 3

5

XMLを次のような構造に解析します。

data Tree = TreeNode (Set Tree) | LeafNode String deriving Eq

これにより、問題がセットと文字列で等しくなるようになります。

于 2012-09-04T23:36:37.507 に答える
0

等式のほとんどの定義(たとえば、XPath deep-equals()関数)は、要素の順序を重要なものとして扱います。Saxonにはパラメータ化された関数saxon:deep-equals()がありますが、それでも要素の順序を無視するオプションはありません-空白を無視するオプションがあるので、(2)と(3)は等しくなります。独自の関数を作成する必要があります。

于 2012-09-05T07:02:19.043 に答える
0

同等性の定義はドメイン固有であるため、おそらくxmlにはEqインスタンスがありません。アプリケーションでは、順序は重要ではなく、繰り返しもありませんが、他の誰かがそれらを使用して、エミュレータで実行するコマンドを一覧表示する場合があります。Content

しかし、これはあなたを止めるべきではありません。インポートされたデータ構造にインスタンスを追加できます。私たちはそれText.XML.Light.Typesを見る

 data CData    = CData {
              cdVerbatim  :: CDataKind,
              cdData      :: String,
              cdLine      :: Maybe Line
            }

定義できるように

instance Eq CData where
   CData v d l == CData v' d' l' = and [v==v',d==d',l==l']

(これは醜いと思いますがcd==cd' = cdVerbatim cd == cdVerbatim cd' && ....、xmlの新しいリビジョンでコンストラクターが追加されると、少なくともコンパイラーエラーが発生します。)

に対して同じ種類の定義を行うことができますがContentElementここでorder-doesn't-matterを実装できます。

instance Eq Element where
   Element n as cs l == Element n' as' cs' l' = and 
           [n==n',
            as==as',
            all (`elem` cs) cs',
            all (`elem` cs') cs,
            l==l']

作成したインスタンスに空白の削除を追加できますEqが、他のデータ型には追加できません。それらを修正する必要がある場合は、独自の関数を定義して、インスタンスsameの代わりにそれを使用できます。==Eq

少しCData厄介で、同じ文字列を表現する方法が異なる可能性があるので、文字列をチェックするだけcdDataでは不十分な場合があります。CDdata同じCDataKindか何かを使用するには、すべてを変換する必要があるかもしれません。一方、xmlがマシンで生成されている場合は、とにかくすべて同じである可能性があります。

于 2012-09-05T12:45:01.057 に答える