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

(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
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 的变更

在旁边的小节:尽管我很愿意帮助维护该项目,但我恐怕只能提供一些不频繁的帮助。

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](https://clojure.atlassian.net/browse/DZIP-6) (由 bpeter 报告)
...