2

単純なプロジェクトで(初めて) clojure を試しています。csv ファイルを指定して xml ツリーを更新する必要があります。私はcsvファイルを1行ずつ読んで、いくつかの値を抽出し、いくつかの値を指定してノードをループし、別の値を持つ子ノードを挿入しています。

これは、アイテムを初めて挿入するときにうまく機能します。2 回目に NullPointerException を取得します (トレースなし)。insert-child から取得した戻り値からルートを検索し、そのルート ノードを次のループに渡します。どういうわけか、そのルート要素で 2 番目の挿入が失敗します。ここで何がうまくいかないのか誰にもわかりますか?または、Clojure を作成するのはこれが初めての試みであるため、このコードに関する全般的なフィードバックをお願いします。

(require 'clojure.string)
(require '[clojure.java.io :as io])
(require '[clojure.xml :as xml])
(require '[clojure.zip :as zip])
(require '[clojure.data.zip.xml :as zf])

(def business-object-config (xml/parse "BusinessObject.config"))
(def zipped (zip/xml-zip business-object-config ))

(defn sql-table-name [table-name]
  (second (re-matches #"(.*?)(Base|ExtensionBase|$)" table-name)))

(defn insert-sqlpropertyname-elem [loc name]
  (zip/root (zip/insert-child loc {:tag :SqlPropertyName :content [name]})))

(defn get-entity-node [table-name crm-name business-objects]
  (first (zf/xml-> business-objects :Entities
    :Entity [:CrmName (zf/text= (clojure.string/lower-case (sql-table-name table-name)))]
    :EntityItems
    :EntityItem [:CrmPropertyName (zf/text= (clojure.string/lower-case crm-name))])))

(defn process-line [line business-objects]
  (let [{crm-name 0 table-name 1 sql-name 6} (clojure.string/split line #";")
        node (get-entity-node table-name crm-name business-objects)]
    (insert-sqlpropertyname-elem node sql-name)))

(defn process-csv []
  (with-open
    [rdr (io/reader "input.csv")]
      (loop [lines (vec (take 5 (rest (line-seq rdr))))
             index (dec (count lines))
             boc zipped]
        (if (neg? index)
          boc
        (recur lines (dec index) (process-line (nth lines index) boc))))))

(spit "out.xml" (with-out-str (xml/emit (process-csv)) :pad true))
4

2 に答える 2

0

the not-so-helpful NPE usually means you ran off the side of the tree somewhere.

i suspect you don't need the call to zip/root in insert-sqlpropertyname-elem.

于 2012-05-30T23:10:54.733 に答える
0

それが正しい方法かどうかはわかりませんが、insert-child の結果に対してルートを呼び出し、ルートに対して xml-zip を呼び出すと、すべて正常に動作します。ミューテーションごとに構造全体を圧縮するのがベスト プラクティスかどうかわかりませんか?

于 2012-05-31T10:16:34.473 に答える