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

欢迎!请参阅关于页面了解有关此工作方式的更多信息。

0
data.zip

我想要选择名为"Group"的XML元素的内容,而这个"Group"元素本身又是嵌套在另一个名为"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

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

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

11 答案

0

由:bpeter发表的评论

我发现了一个“解决方案”,如下所示,也在(link: ^zip-xml-bug-descent.tgz)中。

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

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

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

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

评论者: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 感谢你的解决方案。有人知道修复这个问题是否包含在 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
by
参考资料:https://clojure.atlassian.net/browse/DZIP-6 (由 bpeter 报告)
...