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

在 (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 中的工作有效。我不确定最好的修复方法是什么,似乎有点复杂,很难调整以前的补丁以匹配根节点,显然这是一般情况,所以可能更适合使用 {{root=}} 条件,而不是在所有的 xml-> 匹配器中引入类似 {{descendant=}} 的内容。当然,如果有一种 {{tag=}} 的修复方法可以同时支持这一点,我将非常高兴,但这似乎有点困难。

0
by

由 bwstearns 发布的评论:

今天刚刚遇到了同样的问题。稍早前发布了这个帖子(《https://stackoverflow.com/questions/46535423/cant-access-deeply-nested-xml-with-clojure-data-zip-xml》),但现在我发现我不是唯一/不正常的人。

@bpeter 感谢您的解决方案。是否有人知道这个修复是否包含在 0.1.2 版本中/我能做些什么来帮助实现这一点?

0
by

由 alexmiller 发布的评论:

有人需要深入研究找到一种解决方案,让用户在 DZIP-3 和 DZIP-6 中实现他们想要的功能。这里的补丁是否会导致 DZIP-3 中的问题重新出现?

如果是这样的话,那么需要做更多的工作来找到同时适用于两者的解决方案,或者决定是否有一个情况是不合理的,不应该被支持,或者添加一些可以让用户同时做到这些的功能。

提高一等,我很希望有人能够注册成为 data.zip 的活跃维护者。我曾以驾车路过的方式在这里提供帮助,但没有太多投入。考虑到这里有许多(很显然)关心用户的人,如果你们中的一位提供帮助那就太好了。

0
by

由 skuro 发布的评论:

我认为这个问题提供了强有力的证据不支持同时为 DZIP-3 和 DZIP-6 提供功能。如果我们坚持用 tag= 表示 {quote}
当前标签或子标签
{quote}
那么,支持有与父标签相同的标签的嵌套节点将是不可能的。

我个人认为,检查当前节点的属性发生的频率远低于遍历树,所以关键字谓词的语法糖最好是留进行检查子节点。

附上的补丁遵循 Paul Dlug 提出的路径,并

  • 撤销了 DZIP-3 的更改
  • 以 {{self=}} 谓词的形式提取 DZIP-3 所需的功能

另一方面:虽然我很愿意帮助维护该项目,但我恐怕只能提供一些非正式的帮助。

0
by

由 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
参考: https://clojure.atlassian.net/browse/DZIP-6(由bpeter报告)
...