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 提供

如您所见,我找到了一种“变通方法”并在(link: ^zip-xml-bug-descent.tgz)中

`
(defn descent=
[tagname]
(fn [loc]

    (filter #(and (zip/branch? %) (= tagname (:tag (zip/node %))))

(testing "使用descend选择内部名称"

(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=}}。当然,如果有一种修复方法可以同时支持这两种方式(而我还没看到),那将是最好的,但似乎会比较复杂。

0

评论者:bwstearns

我就在今天遇到了同样的问题。之前发布了这个帖子 (https://stackoverflow.com/questions/46535423/cant-access-deeply-nested-xml-with-clojure-data-zip-xml),但现在我发现,我并不孤单/疯狂。

@bpeter,感谢你的解决方案。有人知道修复这个问题是否会被纳入 0.1.2?我能做什么来帮助让它发生?

0

由 alexmiller 发表的评论:

Someone needs to dig in to see if there is a solution that lets people do what they want in DZIP-3 and here in DZIP-6. Does the patch here re-break the case in DZIP-3?

If so, then more work needs to be done to either find a solution that works for both or to decide whether one of these cases is not valid and shouldn't be supported, or to add something that lets you do both.

提高一个等级,我很希望有人注册成为 data.zip 的活跃维护者。我在此处只是临时帮忙,但对此没有太多投入。鉴于这里有这么多(显然)关心用户的人,如果你们中有人能给予帮助,那将会很棒。

0

由 skuro 发表的评论:

I actually think this issue is concrete evidence supporting that we cannot have something that caters for DZIP-3 and DZIP-6 at the same time. If we stick for tag= to mean {quote}
current tag or child
{quote}
it's simply impossible to support out of the box nested nodes with the same tag as their parent.

It is my personal opinion that checking properties of the current node happens much less frequently than descending the tree, so that the syntax sugar for keyword predicates is best reserved for checking children.

附件中有一个补丁,它遵循 Paul Dlug 提出的路径并

  • 回滚了 DZIP-3 的更改
  • 在专门的 {{self=}} 谓词中提取了所需的功能

接下来:虽然我很乐意帮助维护这个项目,但恐怕我无法承担更多的责任。

0

由 nathan 发表的评论:

对 Benjamin Peter 的工作方式的纠正
他的下降函数底部被省略了

`
(defn descent=
"返回一个查询谓词,当节点是具有 tagname 名称的标签时匹配该节点。
名为 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 报告)
...