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

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

相关bug为DZIP-3

0

评论者:bzg

顺便说一句,我也刚刚遇到了这个回归问题。
希望能够尽快发布一个正确的修复!提前感谢。

0

评论由:bpeter 提供

我的例子在0.1.1中也无法工作,我怀疑这不仅仅是一个回归。@Denis Shilov 可能你想为这个问题创建另一个工单。

0

评论者:pdlug

对这个问题的更新?我们也在遇到这个bug。

0

评论者:pdlug

根据Benjamin Peter的建议,在不包含{{or}}部分的情况下复制{{tag=}}的最新实现,对于我们的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

评论者:alexmiller

有人需要深入调查,以看看是否有解决方案让用户在DZIP-3和这里在DZIP-6中做他们想做的事情。这里的补丁是否又破坏了DZIP-3的情况?

如果是这样,那么需要做更多工作,要么找到适合两者之一的解决方案,要么决定其中一个情况是否不合法,不应得到支持,或者添加一些让你可以做这两者的事情的内容。

再进一步,我很希望有人报名成为data.zip的积极维护者。我以临时方式提供了一些帮助,但我对这件事没有任何影响力。考虑到这里有许多显然关心的用户,如果你们中有人能够提供帮助将非常棒。

0

评论者:skuro

我认为这个问题有力地证明,我们不能同时有什么东西可以满足DZIP-3和DZIP-6。如果我们坚持使用tag=来表示{quote}
当前标签或子标签
{quote}
那么,无法支持默认情况下使用与父标签相同的标签嵌套节点

我个人认为,检查当前节点属性比树遍历发生的频率要低得多,因此,用于检查子节点的关键字谓词的语法糖最好保留。

附上的补丁遵循Paul Dlug建议的路径,并且

  • 撤销来自DZIP-3的更改
  • 在专门的{{self=}}谓词中提取DZIP-3所需的功能

另提一点:尽管我很愿意帮助维护项目,但恐怕我无法做出任何超出随意帮助的承诺。

0

评论者:nathan

Benjamin Peter的解决方案的修正
他的下降函数的下部被剪掉了

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