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

在 (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 "使用下降选择内层元素的名称"

(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中有效 worked

`
(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建议的那样,在不包含{{or}}部分的情况下复制最新的{{tag=}}实现时,这对我们0.2.0-alpha2有效。我不确定这最好的修复是什么,这似乎很棘手,似乎需要容纳先前补丁以允许它匹配根,显然匹配后裔是更常见的情况,因此可能更倾向于使用{{root=}}谓词而不是引入类似{{descendant=}}的东西通过所有的xml->匹配器。当然,如果有一个修复{{tag=}}可以支持这两者而我没有看到的话,那就最好了,但似乎很棘手。

0

评论者:bwstearns

就在今天也遇到了同样的问题。之前发布过这个帖子(《https://stackoverflow.com/questions/46535423/cant-access-deeply-nested-xml-with-clojure-data-zip-xml》) showModal之前的,但现在我发现这并不是我一个人这么认为。

@bpeter 感谢提供的解决方案。有人知道这将会在 0.1.2 中修复吗?我可以做些什么来帮助实现这个目标?

0

评论者:alexmiller

有人需要深入研究,看看是否有一个解决方案可以满足 DZIP-3 和 DZIP-6 的需求。这里的补丁会破坏 DZIP-3 中的情况吗?

如果是这样,那么我们需要做更多的工作,要么找到一种适用于两种情况的解决方案,要么决定其中一种情况进行修改以消除其支持,或者增加一些功能以便同时支持两种情况。

提高一个档次,我很希望有人注册成为 data.zip 的活跃维护者。我以临时方式在这里提供了一些帮助,但我不参与这项游戏。鉴于有这么多(明显)关心用户的人,如果你们中某位能提供帮助将是一件大好事。

0

评论者:skuro

我认为这个问题是支持我们无法同时满足 DZIP-3 和 DZIP-6 需求的实质证据。如果我们坚持使用 tag= 表示 {引用}
当前标签或子标签
{引用}
由于无法支持具有与其父节点相同标签的嵌套节点,因此这是不可能匿名提供的。

我个人认为检查当前节点的属性远不如遍历树频繁,因此关键字谓词的语法糖应该 reserves用于检查子节点。

附上的补丁遵循 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
参考:https://clojure.atlassian.net/browse/DZIP-6(由 bpeter 报告)
...