3

名前空間を認識したxmlパーサー/ジッパーを知っている人はいますか?

大量の軸または同様のライブラリを取り込む必要があるのではなく、次を解析することを望んでいました。

(ns foo
  (:require [clojure.zip :as zip]
            [clojure.xml :as xml])
  (:use clojure.data.zip.xml))

(def xml "<soap:Envelope xmlns=\"urn:WEBSERVICE-URN\"
                         xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"
                         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">
            <soap:Body>
              <loginResponse>
                 <result>           
                    <sessionKey>SESSION-KEY-HERE</sessionKey>
                 </result>
              </loginResponse>
            </soap:Body>
           </soap:Envelope>")

(def root 
  (zip/xml-zip 
    (xml/parse 
      (java.io.ByteArrayInputStream. (.getBytes xml "UTF-8")))))

(def key (xml1-> root ???? ???? :loginResponse :result :sessionKey text))

XML 名前空間を持つ xml 要素をナビゲートできないようです。

4

1 に答える 1

5

xml1->ここでの問題は、XML の名前空間ではなく、名前空間の使用である可能性があると思います。XML zip 名前空間のtag=述語 ( でキーワードを使用する場合に暗示されるxml1->) は、デフォルトで自動下降モードになります。つまり、要素タグの照合を試みる前に、現在のノードの子に下降します。ルート要素はすでに であるsoap:Envelopeため、そのフィルターをxml1->. 以下は、探しているものを提供するはずです。

(xml1-> root :soap:Body :loginResponse :result :sessionKey text)

要素の qname は、展開されていない形式で のタグ名として使用されることに注意してくださいclojure.xml。名前にコロンが含まれるキーワードを使用してもまったく問題ありません。

または、次のように言うこともできます。

(require '[clojure.data.zip :as zf])
(xml1-> (zf/auto false root)
        :soap:Envelope :soap:Body :loginResponse :result :sessionKey text)

名前空間に対応した XML パーサーが必要な場合は、data.xmlにパーサーがありますが、単に名前空間の宣言を破棄し、ローカル名のみを使用します。

(require '[clojure.data.xml :as data-xml])
(def root (-> (java.io.StringReader. xml) data-xml/parse zip/xml-zip)
(xml1-> root :Body :loginResponse :result :sessionKey text)
于 2013-09-19T17:05:33.953 に答える