请在2024 年 Clojure 状态调查!分享您的想法。

欢迎!有关如何操作的更多信息,请参阅关于页面。

0
data.zip

我想要选择一个名为 "Group" 的 XML 元素的内容,这个元素本身位于另一个名为 "Group" 的元素中,使用 xml-zip/xml1。不是返回内部 "Group" 的内容,而是外部 "Group" 元素匹配。如何选择的这种方法不起作用,我怀疑这可能是一个缺陷。

请参阅以下最小示例

`
XML


<?xml version="1.0" encoding="utf-8" standalone="yes"?>

<Name>Outer</Name>
<Group>
  <Name>Inner</Name>
</Group>


(zip-xml/xml1-> root :Root :Group :Group :Name zip-xml/text)
"外部"
`

带有单元测试附件的 Leiningen 项目。运行:lein test

`
$ lein test
lein test :only zip-xml-bug.core-test/parsing-group-elements

在 (parsing-group-elements) 处失败 (core_test.clj:34)
选择内部名称
期望: (= "Inner" (zip-xml/xml1-> root :Root :Group :Group :Name zip-xml/text))
实际: (not (= "Inner" "Outer"))

运行了 1 个测试,包含 2 个断言。
1 个失败,0 个错误。
测试失败。
`

11 答案

0

评论者:bpeter

我已经找到了一个解决方案,如下所示,并在 (链接: ^zip-xml-bug-descent.tgz) 中

`
(defn descent=
[tagname]
(fn [loc]

    (filter #(and (zip/branch? %) (= tagname (:tag (zip/node %))))

(testing "使用 descent 选择内部名称"

(is (= "Inner"
       (-> (zip-xml/xml1-> root :Root :Group (descent= :Group) :Name zip-xml/text)))))

`

似乎在 {{tag=}} 中匹配元素自身,在 {{or}} 表达式中的第一个表达式是我的问题所在。我怀疑它可以用作选择根元素。还有什么其他需求吗?

`
(defn tag=
[tagname]
(fn [loc]

(or (= tagname (:tag (zip/node loc)))
    (filter #(and (zip/branch? %) (= tagname (:tag (zip/node %))))

(zf/children-auto loc)))))
`

也许应该有一个 {{self}} 前缀?

0

评论者:shilder

从0.1.1到0.1.2退步了

更改行为的提交为 https://github.com/clojure/data.zip/commit/c5d6ca25c128f9fe937b11505c7c9736cfa2dd9a

一个简单的测试来检查

这适用于0.1.1

`
(def nestedxml
(parse-str "

1033"))

(deftest same-nested-tags
(is (= "1" (xml1-> nestedxml :area :area text)))
(is (= "033" (xml1-> nestedxml :area :unit text))))
`

相关缺陷是DZIP-3

0

评论者:bzg

值得指出的是,我也遇到了这个退化问题。
希望可以尽快发布一个合适的修复!提前感谢。

0

评论者:bpeter

我的例子也不适用于0.1.1,我怀疑这不仅仅是退步。@Denis Shilov 可能你需要为此创建另一个条目。

0

评论者:pdlug

对此有何更新?我们也遇到了这个缺陷。

0

评论者:pdlug

正如Benjamin Peter建议的那样,当我们复制最新的{{tag=}}实现而省去{{or}}部分时,这适用于我们的0.2.0-alpha2。我不确定最好的修复方法是什么,这里似乎很棘手,似乎很难适应先前的补丁以使其能够匹配根,显然匹配后裔是更常见的用例,因此也许比通过所有xml->匹配器引出类似{{descendant=}}的{{root=}}谓词更优。当然,如果有支持这两种方法的{{tag=}}修复,那是最好的,但似乎很棘手。

0

评论由:bwstearns发表

今天也碰到了同样的问题。刚才发布了这个(https://stackoverflow.com/questions/46535423/cant-access-deeply-nested-xml-with-clojure-data-zip-xml),但现在我知道我不是唯一/疯掉了的人。

@bpeter 谢谢你的解决方案。有人知道这个问题是否会被包含在0.1.2版本中/我能做些什么来帮助实现这一点吗?

0

评论由:alexmiller发表

有人需要深入研究以查看是否存在一种解决方案,允许用户在DZIP-3和DZIP-6中完成他们想要的事情。这里的补丁是否会让DZIP-3中的这种做法失败?

如果是这样,那么需要做更多的工作来找到同时适用于两个方案的解决方案,或者确定其中一个方案是不合理的,不应该被支持,或者添加一些允许你同时执行两个操作的补充内容。

提高一点,我非常希望有人注册成为data.zip的积极维护者。我在这里采取了随机的途径帮助,但我对这件事没有太大的兴趣。鉴于有这么多(显然)关心用户的人,从你们中间得到帮助将会非常棒。

0

评论由:skuro发表

我认为这个问题提供了确凿的证据,证明我们不能同时为DZIP-3和DZIP-6提供解决方案。如果我们坚持用tag=来表示{quote}
当前标签或子标签
{quote}
那么,直接支持具有与父标签相同名称的嵌套节点将是不可能的。

我个人认为,比扫描树更频繁的是当前节点的属性检查,因此关键字谓词的语法糖最好留给子节点的检查。

附上的补丁遵循Paul Dlug的建议,并且

  • 撤销了DZIP-3的更改
  • 在一个专门的{{self=}}谓词中提取了DZIP-3所需的功能

顺便说一句:虽然我很乐意帮助维护这个项目,但我恐怕我无法承诺更多的随意的帮助。

0

评论由:nathan发表

Benjamin Peter的解决方案的修正
他的下降函数的最后部分被剪掉了

`
(defn descent=
"返回一个查询谓词,当节点是一种带有tagname名称的标签时匹配节点。
位于"下方。"
[tagname]
(fn [loc]

  (filter #(and (clojure.zip/branch? %) (= tagname (:tag (clojure.zip/node %))))
           (clojure.data.zip/children-auto loc))))

`

0
by
参考: https://clojure.atlassian.net/browse/DZIP-6(由bpeter报告)
...