2

の後に、またはそれと一緒に使用できる二次的な clojure xml 解析プロジェクトはありclojure-xml/parseますか? もしそうなら、それらは何ですか?

clojure-xml/parseはうまく機能しますが、返されるマップはclojure-xml/parse、少なくともウォーター カット/改ざん xml ファイルの 1 つを解析した後で、深くネストされています。さらに解析できる二次ライブラリが存在するかどうか疑問に思っています。

これは、スクロールする必要がないように、意図的に折り畳まれた xml ファイルの一部です。

:content [{:tag :Header, :attrs nil, :content [{:tag :ExportType, 
:attrs nil, :content ["Tamper Export"]} 
{:tag :CurrentDateTime, :attrs nil, :content ["

マップが埋め込まれたベクトルに注目してください。

これをさらに解析するために使用できるものを確かに開発できますが、モジュールが既に存在するかどうか疑問に思っていました.

ありがとうございました。

4

1 に答える 1

3

コンテンツをさらに「解析」するためのライブラリは clojure.core です。そこにある関数とマクロは、XML から生成されたデータ構造を有用なものに変換するという非常に優れた仕事をすることができます。私の個人的なお気に入りの手法は、first 関数とキーワード関数を利用しながら、2 つのスレッド化マクロを使用することです。深く掘り下げる以上のことをする必要がある場合は、 map を使用できる簡単な関数を作成します。

clojure.xml/parse から返されるデータ構造は、xml と同じくらい深いものです。各要素には 3 つの項目を持つ 1 つのマップがあり、コンテンツは子要素と文字列のベクトルです。もう少し深く見えるかもしれませんが、これは Java XML オブジェクトなどに格納される内容をオープンに表現したものにすぎません。最大の利点は、特別な API を使用する必要がないことです。通常のデータで使用する関数は、XML でも同様に機能します。どちらかといえば、いくつかの関数を記述してドメインに変換するだけです。

次のようなものがあるとします (簡潔にするために属性は省略しています)。

{:tag :stuff
 :content [{:tag item
            :content [{:tag :key :content ["Key one"]}
                      {:tag :value :content ["Item one"]}]}
           {:tag item
            :content [{:tag :key :content ["Key two"]}
                      {:tag :value :content ["Item two"]}]}]}

ネストされていますが、各アイテムを使用可能なものに変換するためのユーティリティ関数を作成します。

(defn transform-item [item]
  (let [key-element (-> item :content first)
        value-element (-> item :content second)]
    [(-> key-element :content first)
     (-> value-element :content first)]))

そして、それをルート要素のコンテンツにマップします。

(defn transform-stuff [stuff-xml]
  (into {} (map transform-item (:content stuff-xml)))

そして、実際にドメインを表すデータが得られるはずです。

{"Key one" "Item One", "Key two" "Item 2"}

重要なのは、それを解析と考えず、あるデータ構造を別のデータ構造に変換するだけだと考えることです。

于 2012-06-27T04:02:00.820 に答える