gpt4 book ai didi

xml - clojure 命名空间感知 xml 解析器/zipper

转载 作者:数据小太阳 更新时间:2023-10-29 02:24:07 24 4
gpt4 key购买 nike

有人知道命名空间感知 xml 解析器/zipper 吗?

我希望解析以下内容,而不是必须引入一大堆轴或类似的库:

(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 元素?

最佳答案

我认为您的问题可能是您使用了 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 中有一个,尽管它只是丢弃 namespace 声明并仅使用本地名称:

(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)

关于xml - clojure 命名空间感知 xml 解析器/zipper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18898823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com