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"))

运行了包含2个断言的1个测试。
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 "使用descent选择内部名称"

(is (= "Inner"
       (-> (zip-xml/xml1-> root :Root :Group (descent= :Group) :Name zip-xml/text)))))

`

似乎在{{tag=}}匹配中的第一个表达式是导致问题的地方。我怀疑它可以用来选择根元素。这是不是有其他需求?

`
(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的。

更改后的行为已提交,请见此处

进行简单测试以检查

此操作在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的建议,当复制没有{{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),但现在我知道我不是唯一的/疯狂的人。

感谢你的解决方案,有人知道修复这个问题是否会被包含在 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=
"返回一个当它是一个名为 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 报告)
...