首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用core.match在clojure中平放解析的xml conent

使用core.match在clojure中平放解析的xml conent
EN

Stack Overflow用户
提问于 2015-07-06 09:41:51
回答 2查看 88关注 0票数 0

考虑以下xml:

代码语言:javascript
复制
      <Period>
        <TimeInterval v="2010-06-20T21:00Z/2010-06-21T21:00Z"/>
        <Resolution v="HOURLY"/>
        <AccountInterval>
            <Pos v="1"/>
            <InQty v="0.0"/>
        </AccountInterval>
        <AccountInterval>
            <Pos v="2"/>
            <InQty v="0.0"/>
        </AccountInterval>
        <AccountInterval>
            <Pos v="3"/>
            <InQty v="0.0"/>
        </AccountInterval>
    </Period>

我希望使用clojure.xml/parse解析XML后返回的数据结构“扁平化”。

代码语言:javascript
复制
{:content
 [{:content nil,
   :attrs {:v "2015-06-20T21:00Z/2015-06-21T21:00Z"},
   :tag :TimeInterval}
  {:content nil, :attrs {:v "PT1H"}, :tag :Resolution}
  {:content
   [{:content nil, :attrs {:v "1"}, :tag :Pos}
    {:content nil, :attrs {:v "0.0"}, :tag :InQty}],
   :attrs nil,
   :tag :AccountInterval}
  {:content
   [{:content nil, :attrs {:v "2"}, :tag :Pos}
    {:content nil, :attrs {:v "0.0"}, :tag :InQty}],
   :attrs nil,
   :tag :AccountInterval}
  {:content
   [{:content nil, :attrs {:v "3"}, :tag :Pos}
    {:content nil, :attrs {:v "0.0"}, :tag :InQty}],
   :attrs nil,
   :tag :AccountInterval}],
 :attrs nil,
 :tag :Period}

若要获得这类向量:

代码语言:javascript
复制
["2010-06-20T21:00Z/2010-06-21T21:00Z" "HOURLY" 1 0.0 2 0.0 3 0.0]

我如何在clojure中使用core.match来实现这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-06 10:17:06

您可以使用一个非常简单的递归函数来完成这个任务:

代码语言:javascript
复制
(defn flatten-xml
  [{:keys [attrs content]}]
  (if-let [v (:v attrs)]
    [v]
    (mapcat flat-xml content)))

因此,如果您有一个具有解析的XML数据的data变量,您可以使用这个flatten-xml函数将其扁平化:

代码语言:javascript
复制
(flatten-xml data)
; => ("2015-06-20T21:00Z/2015-06-21T21:00Z" "PT1H" "1" "0.0" "2" "0.0" "3" "0.0")
票数 1
EN

Stack Overflow用户

发布于 2015-07-06 12:43:14

另一种方法是:

代码语言:javascript
复制
 (defn flatten-bfs [{:keys [attrs content]}]
  (loop [ret [], queue (into clojure.lang.PersistentQueue/EMPTY content)]
    (if (seq queue)
      (let [{attrs :attrs children :content} (peek queue)]
       (recur (if (nil? (:v attrs)) ret (conj ret (:v attrs)))  (into (pop queue) children))
       )
      ret
      )
    )
  )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31242478

复制
相关文章

相似问题

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