2024 Clojure 状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解此工作流程的更多信息。

0
data.zip

我想选择名为 "Group" 的 XML 元素的内容,该元素本身位于名为 "Group" 的元素内。使用 xml-zip/xml1 时,而不是返回内部 "Group" 的内容,外部的 "Group" 元素匹配了。选定这种方法的尝试没有奏效,我怀疑这可能是一个缺陷。

请参阅最小示例

`
XML

root
<?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)
"Outer"
`

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

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

FAIL in (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 "selecting the name of inner using 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))))
`

相关的bug是DZIP-3

0
by

由:bzg发表的评论

就这个话题来说,我也刚刚遇到了这个问题。
希望很快能发布一个合理的修复!提前感谢。

0
by

评论由:bpeter 提出评论

我的例子也无法在0.1.1版本中工作,我怀疑这不仅仅是一个回归。@Denis Shilov 可能您需要为这个问题创建另一个工单。

0
by

由:pdlug发表的评论

关于此事项有任何更新吗?我们也在遇到这个bug。

0
by

由:pdlug发表的评论

当按照Benjamin Peter的建议,在不包含{{or}}部分的情况下复制{{tag=}}的最新实现时,0.2.0-alpha2对我们来说是可行的。我不确定这里最好的修复方法似乎很棘手,显然匹配根元素比匹配后代更常见,因此可能更倾向于使用{{root=}}谓词,而不仅仅是通过所有的xml->匹配器引入像{{descendant=}}这样的东西。当然,如果有一些修复{{tag=}}的方案能够支持这两种情况,我将看不到那将是最好的,但似乎很棘手。

0
by

由:bwstearns发表的评论

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

感谢 @bpeter 提供的解决方案。有人知道修复这个 bugs 是否会包含在 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 的标签时匹配节点。”
whichever
[tagname]
(fn [loc]

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

`

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