请在 2024 Clojure 状态调查! 分享您的想法。

欢迎!请参阅 关于 页面以获取更多此平台工作方式的信息。

0
data.zip

我想选择名为 "Group" 的 XML 元素的内容,该元素本身位于名为 "Group" 的元素中,使用 xml-zip/xml1。而不是返回内部 "Group" 的内容,外部的 "Group" 元素匹配。选择这种方法的做法不起作用,我怀疑这可能是缺陷。

请查看最小示例

`
XML


<?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)
"外部"
`

包含单元测试的 Leiningen 项目。运行:lein test

`
$ lein test
lein test :only zip-xml-bug.core-test/parsing-group-elements

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

运行了 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 "selecting the name of inner using 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

对此有任何更新吗?我们也遇到了这个bug。

0

评论者:pdlug

当按照Benjamin Peter的建议复制{{tag=}}的最新实现,不包含{{or}}部分时,这对我们来说在0.2.0-alpha2中工作。我不确定最好的修复方法是什么,这似乎很棘手,得适应先前的补丁以允许它匹配根,显然匹配子节点是一个更常见的情况,因此可能更倾向于使用{{root=}}谓词,而不是在整个xml->匹配器中引入类似{{descendant=}}的东西。当然,如果有某种修复{{tag=}},使其能够支持这两种情况,而我没有看到,那将是最好的,但似乎很棘手。

0

评论者: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报告)
...