代码之家  ›  专栏  ›  技术社区  ›  Hamza Yerlikaya

Clojure XML解析

  •  64
  • Hamza Yerlikaya  · 技术社区  · 15 年前

    我找不到任何有关如何解析XML文档和访问元素的信息。

    我找到了两种解析XML文档的方法

    (clojure.zip/xml-zip (clojure.xml/parse file))
    

    (parse-seq file)
    

    但我似乎能找到关于如何处理结果结构的任何信息?

    源文件引用了zip-query.clj中关于如何查询结果的内容,但似乎也遗漏了这个内容。

    2 回复  |  直到 11 年前
        1
  •  80
  •   Community CDub    7 年前

    假设您的文件中要分析以下XML:

    <high-node>
       <low-node>my text</low-node>
    </high-node>
    

    你加载 clojure.xml :

    user=> (use 'clojure.xml)
    

    解析时,XML将具有以下结构:

    {:tag :high-node, :attrs nil, :content [{:tag :low-node, :attrs nil, :content ["my text"]}]}
    

    然后您可以对文件的内容进行排序,以获取 low-node :

    user=> (for [x (xml-seq 
                  (parse (java.io.File. file)))
                     :when (= :low-node (:tag x))]
             (first (:content x)))
    
    ("my text")
    

    同样,如果您想访问低节点上的整个信息列表,您可以更改 :when 谓语到 (= (:high-node (:tag x))) :

    user=> (for [x (xml-seq 
                  (parse (java.io.File. file)))
                     :when (= :high-node (:tag x))]
             (first (:content x)))
    
    ({:tag :low-node, :attrs nil, :content ["my text"]})
    

    这是因为关键字可以作为函数操作。见 Questions about lists and other stuff in Clojure Data Structures: Keywords

        2
  •  54
  •   Community CDub    7 年前

    上面的答案是可行的,但我发现它更容易使用 clojure.data.zip.xml (过去是) clojure-contrib.zip-filter.xml 在clojure 1.3之前)。

    文件:

    myfile.xml :

    <songs>
      <track id="t1"><name>Track one</name></track>
      <track id="t2"><name>Track two</name></track>
    </songs>
    

    代码:

    ; Clojure 1.3
    (ns example
      (:use [clojure.data.zip.xml :only (attr text xml->)]) ; dep: see below
      (:require [clojure.xml :as xml]
                [clojure.zip :as zip]))
    
    (def xml (xml/parse "myfile.xml"))
    (def zipped (zip/xml-zip xml))
    (xml-> zipped :track :name text)       ; ("Track one" "Track two")
    (xml-> zipped :track (attr :id))       ; ("t1" "t2")
    

    不幸的是,你需要依赖 data.zip 以获得这种良好的读取/过滤功能。 值得依赖:) lein 将是(截至2013年8月17日):

    [org.clojure/data.zip "0.1.1"]
    

    至于文件 data.zip.xml …我只查看相对较小的源文件 here 看看有什么可能。另一个很好的答案 here 也是。

    推荐文章