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

FAIL in (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 "使用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

对此有任何更新吗?我们也在遇到这个缺陷。

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