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"))

执行了包含 2 个断言的 1 个测试。
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

当按照Benjamin Peter的建议复制{{tag=}}{{without}}部分而不复制最新实现时,我们的确使用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

评论者:alexmiller

需要有人深入研究以查看是否有解决方案允许用户在DZIP-3和DZIP-6中做他们想做的事情。这里的补丁是否会重新中断DZIP-3中的情况?

如果是这样,那么需要做更多的工作来找到两个都适用的解决方案,或者决定其中一个情况无效,不应该得到支持,或者添加一些允许您同时执行这两个操作的东西。

提升一点,我非常希望有人注册成为data.zip的活跃维护者。我在这里以路过的形式提供帮助,但我对此事并不关心。鉴于这里有一群(显然)关心用户的用户,有你们的帮助将会非常好。

0

评论者:skuro

实际上,我认为这个问题是明确的证据,表明我们不能同时满足DZIP-3和DZIP-6的需求。如果我们坚持认为tag=表示{quote}
当前标签或子标签
{quote}
那么,支持具有与父节点同一标签的嵌套节点将变得不可能。

我认为,检查当前节点的属性比遍历树要频繁得多,因此关键词谓词的语法糖最好保留用于检查子节点。

附件中是一个遵循Paul Dlug建议的补丁,

  • 撤销了DZIP-3的更改
  • 将DZIP-3所需的功能提取到特定的{{self=}}谓词中

旁白:尽管我非常愿意帮助维护项目,但我恐怕无法承诺更多的随机帮助。

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