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

我发现了一种“解决方案”,如下所示,并在(link: ^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)))))

`

这似乎是{{tag=}}中匹配的元素位于{{or}}表达式的{{tag=}}匹配中的第一个表达式是我的问题中的问题。我怀疑它可以用作选择根元素。是否还有其他需要?

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

评论者为:bzg

就所值,我刚刚也遇到了这个回归。
希望可以尽快发布一个正确的修复方案!提前感谢。

0
by

评论者为:bpeter

我的例子也无法用0.1.1运行,我怀疑这不仅仅是一个回归。@Denis Shilov 可能你需要为这个问题创建另一个工单。

0
by

评论者为:pdlug

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

0
by

评论者为:pdlug

根据 Benjamin Peter 的建议,当我们复制 {{tag=}} 的最新实现但没有复制 {{or}} 部分,我们使用 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

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