2024 年 Clojure 状态调查中分享您的想法!

欢迎!请访问关于页面以了解更多关于本页如何工作的信息。

0
data.zip

我想选择名为 "Group" 的 XML 元素的内容,该元素自身位于名为 "Group" 的元素中,使用 xml-zip/xml1。而不是返回内部 "Group" 的内容,外部 "Group" 元素被匹配。选择这种方法的尝试没有奏效,我怀疑这可能是缺陷。

请参阅最小示例

`
XML


<?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)
"外部"
`

包含单元测试的 Leiningen 项目作为附件。运行:lein test

`
$ lein test
lein test :only zip-xml-bug.core-test/parsing-group-elements

在 (parsing-group-elements) (core_test.clj:34) 中失败
选择内部名称
期望: (= "内部" (zip-xml/xml1-> root :Root :Group :Group :Name zip-xml/text))
实际: (not (= "内部" "外部"))

运行了 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=}} 中匹配元素本身的第一个表达式是我在此-case 中的问题。我怀疑它可以用作选择根元素。还有其他用途吗?

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

相关的bug是DZIP-3

0

评论者:bzg

顺便说一下,我也遇到了这个回归。
希望可以尽快发布一个合适的补丁!提前感谢。

0

评论者:bpeter

我的示例在0.1.1版本中也无法工作,我怀疑这不仅仅是回归。@Denis Shilov 可能你需要为这个问题创建一个新的工单。

0

评论者:pdlug

对此有何更新?我们遇到了这个bug。

0

评论者:pdlug

根据BenjaminPeter的建议,我们在复制最新的{{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(由 bpeter 报告)
...