请在2024 年Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解更多有关此功能的信息。

0
data.zip

我想选择名为"Group"的XML元素的文本内容,该元素本身位于一个名为"Group"的元素中,使用xml-zip/xml1。而inner "Group"的内容没有返回,而是匹配到outer的"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=}}匹配的第一个表达式中匹配到自身的是问题。我怀疑它可以用来选择根元素。是否有其他需要用它的情况?

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

评论由:bzg发表

就我个人而言,我也遇到了这个回归问题。
希望可以尽快发布一个正确的修复程序!提前感谢。

0
by

由:bpeter发表的评论

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

0
by

评论由:pdlug发表

对这个有任何更新吗?我们也在遇到这个bug。

0
by

评论由:pdlug发表

当如Benjamin Peter建议的那样,在不包含{{or}}部分的情况下复制{{tag=}}的最新实现时,它适用于我们的0.2.0-alpha2。我不确定什么是最合适的修复方案,这似乎很难允许它与根匹配的先前的补丁,显然匹配后代的方案更常见,因此可能更倾向于使用{{root=}}谓词,而不是在所有的xml->匹配器中引入类似{{descendant=}}的东西。当然,如果有一些针对{{tag=}}的修复可以支持这两者,我没有看到那将是最好的,但似乎比较困难。

0
by

评论由: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=
“返回一个查询谓词,当节点是一个名为tagname的标签时,与节点匹配
的标签
[tagname]
(fn [loc]

  (filter #(and (clojure.zip/branch? %) (= tagname (:tag (clojure.zip/node %))))
           (clojure.data.zip/children-auto loc))))

`

0
...