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

在 (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 "使用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}}部分,这对我们有效。我不确定这里最好的修复是什么,似乎要适应先前的补丁以使其可以匹配根节点有点棘手,显然匹配后代的情况更常见,因此可能更偏好于使用{{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
...