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 (= "内部" "外部"))

运行了包含 2 个断言的 1 个测试。
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=}} 匹配元素本身时,(link: ^zip-xml-bug-descent.tgz) 中的 {{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一起工作。我不确定这里最好的修复方法,这里似乎很难适应之前的补丁使其匹配根元素,明显匹配后代是一个更常见的情况,因此可能首选引入类似于 {{descendant=}} 的谓词,而不是通过所有的 xml-> 匹配器。当然,如果有一种对 {{tag=}} 的修复可以同时支持两者而我没有看到,那将是最好的,但这似乎很困难。

0

评论者:bwstearns

今天也遇到了同样的问题。刚才发表了这个链接,但现在我发现我不是一个人在战斗。

@bpeter 感谢你的解决方案。知道这个问题正在解决进0.1.2版本中吗?或者我能做些什么来帮助解决这个问题吗?

0

评论者:alexmiller

有人需要深入探究,看看是否有解决方案允许人们同时在DZIP-3和DZIP-6中实现他们想要的功能。这里的补丁是否会重新破坏DZIP-3中的情况?

如果是这样,那么就需要更多的工作去做,要么找到一个同时适合两者解决方案,要么决定其中一个情况是不合法的,不应该被支持,或者添加一些功能来让两者都可行。

提高一个档次,我非常希望有人能注册成为data.zip的积极参与者。我曾偶尔在这里帮忙,但对此没有直接责任。考虑到这里有用心的一堆用户,拥有你们的帮助将非常棒。

0

评论者:skuro

我认为这个问题是支持这样一个事实的Concrete evidence,即我们不能同时照顾到DZIP-3和DZIP-6。如果我们坚持使用 tag= 表示 {quote}
当前标签或子标签
{quote}
那么,出于盒外支持与父标签相同标签的嵌套节点是不可能的。

我个人认为检查当前节点的属性发生的频率低于在微博上下树,因此语法的简写对关键词谓词应用的最佳位置是检查子标签。

附上一个补丁,它遵循Paul Dlug的建议并

  • 回滚从DZIP-3的更改
  • 并在专用 {{self=}} 谓词中获取DZIP-3所需的功能

顺便一说:尽管我很乐意帮助维护这个项目,但我恐怕除了偶尔的帮助之外,我再也不能承诺更多的支持了。

0

评论者: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 报告)
...