3

同じトピックに関する2番目の質問をお詫びしますが、混乱しています。lxmlに続くClojureモジュールはありますか、それとも大まかに、またはClojureを使用してXMLファイルをウォークスルーする方法に関するハウツードキュメントはありますか?

Pythonでは、 lxmlモジュールを使用してXMLファイルを開くことができます。データを解析します。のようなタグを探し<DeviceID>, <TamperName>, <SecheduledDateTime>、それらのタグの1つの値に基づいてアクションを実行します。

Clojureでは、data.xmlを使用して解析し、:contentタグの値を取得して情報をtree-seqに入れることにより、data.xmlで解析される情報をさらに減らす方法について優れた回答が得られました。

ただし、その結果のデータでさえ、他のマップタグが埋め込まれているため、キーやvals関数に応答しないことは明らかです。

このデータを取得して正規表現検索を使用することはできますが、もっと単純なものが欠けているように感じます。

data.xml / parse(呼び出しret-xml-data)からのデータは、REPLでさまざまな(最初のparsed-xml)およびその他のコマンドを使用して次のようになります。

[:tag :TamperExport]
[:attrs {}]
:content
#clojure.data.xml.Element{:tag :Header, :attrs {}, :content 
(#clojure.data.xml.Element{:tag :ExportType, :attrs {}, 
:content ("Tamper Export")} 
#clojure.data.xml.Element{:tag :CurrentDateTime, 
:attrs {}, 
:content ("2012-06-26T15:40:22.063")} :attrs {}, 
:content ("{06643D9B-DCD3-459B-86A6-D21B20A03576}")}

これが私がこれまでに持っているClojureコードです:

(defn ret-xml-data
    "Returns a map of the supplied xml file, as parsed by data.xml/parse."
    [xml-fnam]

    (let [input-xml (try
                        (java.io.FileInputStream. xml-fnam)
                        (catch Exception e))]

        (if-not (nil? input-xml)
            (xmld/parse input-xml)
            nil)))

(defn gen-xml-content-tree
    "Returns a tree-seq with :content extracted."

    [parsed-xml]
    (map :content (first (tree-seq :content :content (:content parsed-xml)))))

ホッジポッドを作成せずにこれを解析できるようにする、データの繰り返し可能なパターンを見つけた可能性があると思います。

xml-lib.core=> (first (second cl1))
#clojure.data.xml.Element{:tag :DeviceId, :attrs {}, :content ("80580608")}
xml-lib.core=> (keys (first (second cl1)))
(:tag :attrs :content)
xml-lib.core=> (vals (first (second cl1)))
(:DeviceId {} ("80580608"))

いつもありがとうございます。

編集:さらにいくつかのテストを追加します。

結果のデータは、doseqのような関数を使用してtree-seq構造を実行した場合、実行されたアクションで解析できる可能性があります。

4

2 に答える 2

1

まず、あなたが何をしようとしているのかを正確に伝えるのは難しいです。プログラミングの問題に取り組むとき、それはあなたと他の人の両方があなたがより大きなものに取り組む前にあなたが提示して解決することができる「小さなケース」を持つのを助けるのを助けます。

それがどのように聞こえるかから、あなたは特定の要素からコンテンツを引き出し、そのコンテンツに基づいてアクションを実行しようとしています。

いくつかの簡単なコンテンツを含む小さなXMLファイルをまとめて試してみました。

<root>
    <someele>
        <item1>data</item1>
        <deeper>
            <item2>else</item2>
        </deeper>
    </someele>
</root>

私はそれを、目前の問題に関するいくつかの主要な課題を代表するものになるように設計しました。特に、XML内の任意のレベルのネストで処理を実行できるようにしました。

すばらしいClojureチートシートを見て、私はそれを見つけxml-seqて、dxmlで実行してみましたclojure.data.xml/parse。シーケンスは各要素を通過し、次にそれらの子を通過したため、XMLを簡単に反復できます。

forシーケンス内の特定のアイテムを選択して操作するには、ループを使用するのが好き:whenです。:whenを使用すると、特定の条件が真の場合にループの本体に簡単に入ることができます。また、「関数としてのセット」セマンティクスを使用します。これは、セットに何かが含まれているかどうかを確認します。

(for [ele (xml-seq (load-xml))
      :when (#{:item1 :item2} (:tag ele))]
  [(:tag ele) (first (:content ele))])

これにより、([:item1 "data"] [:item2 "else"])のシーケンスが返され、他の方法で簡単に操作できます。

Clojureについて覚えておくべき重要なことの1つは、何かを行うために特別なAPIを必要としない傾向があることです。コア言語を使用すると、すべてではないにしても、ほとんどのことを簡単に実行できます。レコード(返されるのが見えるもの)も、たとえばマップであるため、assoc、dissocなどがレコードで機能し、それらがどのように機能するかを示しています。

これが必要なものに到達するのに役立たない場合は、小さなサンプル出力と必要なサンプル結果を提供できますか?

于 2012-07-12T03:21:38.007 に答える
1

(非常に)簡単な外観の後でlxmlについて考えることができる最も近いClojureライブラリはEnliveと呼ばれます。HTMLテンプレートツールとしてリストされていますが、HTML要素を選択するために使用する手法はXMLにも適用できると確信しています。

于 2012-07-12T04:22:43.103 に答える