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

我发现了一个“解决方法”,如下所示,并在:这里

`
(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=}}}的最新实现而不包含{{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
...