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 "using descent to select the name of inner"

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

评论者:bzg

顺便说一下,我也被这个回归困扰了。
希望可以尽快发布一个合适的修复!提前表示感谢。

0
jira

由:bpeter 评论

我的例子在 0.1.1 也不工作,我怀疑这不仅仅是一个回归。@Denis Shilov,你可能想为这个问题创建另一个工单。

0
Sep 6, 20E

评论者:pdlug

这个有什么更新吗?我们也在遇到这个错误。

0
Sep 6, 20E

评论者:pdlug

根据 Benjamin Peter 的建议,当复制最近的 {{tag=}}实现而不包括 {{or}} 部分,对于 0.2.0-alpha2 我们这是有效的。我不确定什么是最合适的修复,这里似乎很棘手,显然要允许与根匹配以及与后代匹配,这更常见,因此可能更倾向于使用 {{root=}} 提示而不是在所有 xml-> 匹配器中引入像 {{descendant=}} 这样的内容。当然,如果有支持上述两种情况的 {{tag=}} 的修复而我尚未看到,那将是最好的,但似乎很棘手。

0
Oct 3, 2017

评论者: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 撤销更改
  • 将 DZIP-3 所需的功能抽取到专门的 {{self=}} 谓词中

作为一个附带说明:虽然我很乐意帮助维护项目,但我担心我只能提供传统的帮助。

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
...