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 "使用 descent 选择内部名称"

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

`

It seems the first expression in {{tag=}} matching the element itself in the {{or}} expression is the problem in my case. I suspect it can be used to select the root element. Is there any other need for it?

`
(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 提供

在使用 0.2.0-alpha2 以及 Benjamim Peter 建议的不包含 {{or}} 的最新实现时,这对我们来说工作正常。我不确定最好的修复方案是什么,这似乎很棘手,似乎很难适应之前的补丁,允许它与根匹配。显然,匹配子代更为常见,因此可能更喜欢使用 {{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

评论者: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。”
[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)
...