Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何仅从clojure中嵌套的XML中筛选一些值?_Xml_Clojure - Fatal编程技术网

如何仅从clojure中嵌套的XML中筛选一些值?

如何仅从clojure中嵌套的XML中筛选一些值?,xml,clojure,Xml,Clojure,我输入了XML,并将其转换为clojure映射,可以看到一个clojure映射中的所有值,如下所示 但是如何从嵌套的detail_D1标记XML结构中过滤某些值(mnamunreceived) 我的XML是这样的,为了简洁起见被截断了: <svResponse category="EVENT" environment="ENV910" pwd="asdfas" responseCreator="XAPI" role="ALL" session="7370710" token="asdfa

我输入了XML,并将其转换为clojure映射,可以看到一个clojure映射中的所有值,如下所示

但是如何从嵌套的detail_D1标记XML结构中过滤某些值(mnamunreceived)

我的XML是这样的,为了简洁起见被截断了:

<svResponse category="EVENT" environment="ENV910" pwd="asdfas" 
responseCreator="XAPI" role="ALL" session="7370710" token="asdfasf" 
type="realTimeEvent" user="sv" 
xmlns:rte="http://www.schemas.e1.oracle.com">
    <event>
        <header>
            <eventVersion>1.0</eventVersion>
            <type>EVENTOUT</type>
            <user>sv</user>
            <role>*ALL</role>
           </header>
        <body elementCount="3">
            <detail_D1>
                <szNextStatus>999</szNextStatus>
                <mnOrderLineNumber>1.000</mnOrderLineNumber>
                <mnAmountReceived>100</mnAmountReceived>
            </detail_D1>            
            <detail_D1>
                <szNextStatus>999</szNextStatus>
                <mnOrderLineNumber>2.000</mnOrderLineNumber>
                <mnAmountReceived>200</mnAmountReceived>
            </detail_D1>           
            <detail_D1>
                <szNextStatus>999</szNextStatus>
                <mnOrderLineNumber>3.000</mnOrderLineNumber>
                <mnAmountReceived>300</mnAmountReceived>
            </detail_D1>
        </body>
    </event>
</svResponse>
我正在尝试使用eg的值1.0过滤掉mnOrderLineNumber,以便获得它对应的mnAmountReceived值

(defn filter-price-line [coll]
(filter #(#{1.0} (-> % :mnOrderLineNumber read-string)) coll)
)

我想过滤掉mnamonreceived,并知道它随附的mnOrderLineNumber,这样我就可以在响应中将它映射到下游系统的适当字段。

似乎您想要解析XML,并且能够将每个
细节\u D1
视为一个映射,这样您就可以将行号和收到的金额放在一起。如果是这种情况,一种方法可能是使用zippers解析数据以关闭数据结构,然后
过滤
。以下是一个例子:

(ns so
  (:require [clojure.data.xml :as x]
            [clojure.data.zip.xml :as z]
            [clojure.zip :as zip]
            [clojure.java.io :as io]))

(defn parse
  [file]
  (letfn [(parse-detail [z]
            {:next-status     (Integer/parseInt (z/xml1-> z :szNextStatus z/text))
             :line-number     (Double/parseDouble (z/xml1-> z :mnOrderLineNumber z/text))
             :amount-received (Integer/parseInt (z/xml1-> z :mnAmountReceived z/text))})]
    (with-open [r (io/reader file)]
      (let [zipper (->> r x/parse zip/xml-zip)]
        (z/xml-> zipper :svResponse :event :body :detail_D1 parse-detail)))))


(comment
  (parse "input.xml") =>
  ({:next-status 999 :line-number 1.0 :amount-received 100}
   {:next-status 999 :line-number 2.0 :amount-received 200}
   {:next-status 999 :line-number 3.0 :amount-received 300})

  (filter (comp #{1.0} :line-number) (parse "input.xml")) =>
  ({:next-status 999 :line-number 1.0 :amount-received 100})
  )

您需要序列化回XML吗?您想要一个id为amount的映射吗?e、 不,我不想将它序列化回xml,但要保留它的映射@Carcigenicate for eg:这些MNAMOUNTECEIVED字段虽然在XML中名称相同,但实际上是不同类型项目的成本。。。所以,当我处理它时,我想说当mnOrderLineNumber为1.0时,A部分的成本是$;当mnOrderLineNumber为2.0时,B部分的成本为$,依此类推。。。我依靠mnOrderLineNumber作为键来理解MNAMOUNTECEIVED。@pete23是的,类似的东西会帮助我。clojure.data.zip.xml,这是当前有效的clojure包吗?我将它添加到project.clj中,但似乎无法下载它,因此在z/xml->unresolved上出现了错误s。你能给我指一下那个包裹吗?这些是我目前正在使用的“``[org.clojure/data.xml“0.0.8”][org.clojure/data.zip“0.1.3”][org.clojure/clojure-contrib“1.2.0”]`@Tabber您不需要
org.clojure/clojure contrib
就可以让这个示例生效。我使用了
[org.clojure/data.zip“0.1.3”]
[org.clojure/data.xml“0.0.8”]
。我还增加了最低回购。
(ns so
  (:require [clojure.data.xml :as x]
            [clojure.data.zip.xml :as z]
            [clojure.zip :as zip]
            [clojure.java.io :as io]))

(defn parse
  [file]
  (letfn [(parse-detail [z]
            {:next-status     (Integer/parseInt (z/xml1-> z :szNextStatus z/text))
             :line-number     (Double/parseDouble (z/xml1-> z :mnOrderLineNumber z/text))
             :amount-received (Integer/parseInt (z/xml1-> z :mnAmountReceived z/text))})]
    (with-open [r (io/reader file)]
      (let [zipper (->> r x/parse zip/xml-zip)]
        (z/xml-> zipper :svResponse :event :body :detail_D1 parse-detail)))))


(comment
  (parse "input.xml") =>
  ({:next-status 999 :line-number 1.0 :amount-received 100}
   {:next-status 999 :line-number 2.0 :amount-received 200}
   {:next-status 999 :line-number 3.0 :amount-received 300})

  (filter (comp #{1.0} :line-number) (parse "input.xml")) =>
  ({:next-status 999 :line-number 1.0 :amount-received 100})
  )