首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Clojure中对XML文档进行多处突变

在Clojure中对XML文档进行多处突变
EN

Stack Overflow用户
提问于 2012-05-31 05:17:56
回答 2查看 315关注 0票数 2

我正在(第一次)为一个简单的项目尝试clojure。我需要在给定csv文件的情况下更新xml树。我逐行读取csv文件,提取一些值,循环给定一些值的节点,然后用另一个值插入一个子节点。

这在我第一次插入一个项目时工作得很好。第二次我得到一个NullPointerException (没有跟踪)。我从从insert-child获得的返回值中查找根节点,并将该根节点传递到下一个循环。不知怎么的,第二次插入在根元素上失败了。有人看到这里出了什么问题吗?或者一般对这段代码的反馈,因为这是我第一次尝试编写一些Clojure。

代码语言:javascript
复制
(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))
EN

回答 2

Stack Overflow用户

发布于 2012-05-31 07:10:55

不太有用的NPE通常意味着你从树上的某个地方跑下来了。

我怀疑您不需要在insert-sqlpropertyname-elem中调用zip/root

票数 0
EN

Stack Overflow用户

发布于 2012-05-31 18:16:34

好吧,我不知道这是不是正确的方式,但是如果我在insert-child的结果上调用root,然后在根上调用xml-zip,一切都会正常工作。不知道在每次突变后压缩整个结构是不是最好的做法?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10824419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档