根据标记内容从xml中提取条目

时间:2014-02-06 19:46:21

标签: xml clojure

我有一个类似于下面的

的xml
<countryResults>
 <countryResult>
 <PricingMode>CPM</PricingMode>
 <countryRegions>
 <Regions>
 <Region>
 <RegionID>Ds01</RegionID>
 <SensitivityAsset ID=\"19940\" ClassID=\"CreditCurve\"/>
 <RegionEntry>
 <Dimension>
 <type>Currency</type>
 <value>EUR&gt;EUR.EONIA</value>
 </Dimension>
 <Dimension>
 <type>ValueA_0</type>
 <value>87.90199815542161</value>
 </Dimension>
 <RegionValueSet>
 <Value>239.11331582</Value>
 <DsShiftPerHzShift>1.7732635616468646</DsShiftPerHzShift>
 <Credit>19940</Credit>
 </RegionValueSet>
 </RegionEntry>
 </Region>
  <Region>
 <RegionID>EMEA</RegionID>
 <RegionEntry>
 <Dimension>
 <type>Currency</type>
 <value>EUR</value>
 </Dimension>
 <Dimension>
 <type>ValueA_0</type>
 <value>-7.300000000002148</value>
 </Dimension>
 <RegionValueSet>
 <Value>0.01664004</Value>
  <Benchmark>EUR.1M3M.1B</Benchmark>
 </RegionValueSet>
 </RegionEntry>
 <RegionEntry>
 <Dimension>
 <type>Currency</type>
 <value>EUR</value>
 </Dimension>
 <Dimension>
 <type>ValueA_0</type>
 <value>-8.000000000003963</value>
 </Dimension>
 <RegionValueSet>
 <Value>-0.00057985</Value>
 <Benchmark>EUR.1M3M.1M</Benchmark>
 </RegionValueSet>
 </RegionEntry>
 <RegionEntry>
 <Dimension>
 <type>Currency</type>
 <value>EUR</value>
 </Dimension>
 <Dimension>
 <type>ValueA_0</type>
 <value>-9.400000000007434</value>
  </Dimension>
 <RegionValueSet>
 <Value>0</Value>
 <Benchmark>EUR.1M3M.3M</Benchmark>
 </RegionValueSet>
 </RegionEntry>

实际的xml要大得多,并且EMEA RegionID标记内有不同数量的RegionEntries。我基本上需要搜索xml并拉回RegionID = EMEA的Region中的所有标签。我需要从xml的这个分支中提取所有数据。 I.E我需要获取所有尺寸,值,类型,基准值并将它们作为列转储到文件中。

有人可以建议我如何用clojure xml做到这一点?

解析xml之后我尝试下面的方法来获取维度/值标记值:

regions (zf/xml-> xmlmap :countryResults :countryResult :countryregions :regions :region)

    regions1(for [region regions :let [x (zf/xml-> region :region :regionID)]

                   :when (some (zf/text= "EMEA") x)]

  {:section (zf/xml1-> region :regionEntry :Dimension :value)})

非常感谢有关如何做到这一点的任何建议

1 个答案:

答案 0 :(得分:0)

根据您的输出要求,这有用吗?

(def data (zip/xml-zip (xml/parse _INPUT_)))

(for [region (xml-> data
                    :countryResult :countryRegions :Regions :Region)
      :when (= (xml1-> region :RegionID text) "EMEA")
      entry (xml-> region :RegionEntry)]
  {:region-value-sets (for [region-value-set (xml-> entry :RegionValueSet)]
                        {:benchmark (xml1-> region-value-set :Benchmark text)
                         :value (xml1-> region-value-set :Value text)})
   :dimensions (for [dimension (xml-> entry :Dimension)]
                 {:type (xml1-> dimension :type text)
                  :value (xml1-> dimension :value text)})})
;({:region-value-sets ({:benchmark "EUR.1M3M.1B", :value "0.01664004"}),
;  :dimensions
;  ({:type "Currency", :value "EUR"}
;   {:type "ValueA_0", :value "-7.300000000002148"})}
; {:region-value-sets
;  ({:benchmark "EUR.1M3M.1M", :value "-0.00057985"}),
;  :dimensions
;  ({:type "Currency", :value "EUR"}
;   {:type "ValueA_0", :value "-8.000000000003963"})}
; {:region-value-sets ({:benchmark "EUR.1M3M.3M", :value "0"}),
;  :dimensions
;  ({:type "Currency", :value "EUR"}
;   {:type "ValueA_0", :value "-9.400000000007434"})})

我没有在基本拉链函数之上创建任何辅助函数,但它们可能会稍微清理一下代码。