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 "using descent to select the name of the inner"

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

`

似乎在{{tag=}}匹配{{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的建议,在不包含{{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
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=
"返回一个查询谓词,当节点其是一个标签时匹配该节点
名为“.basename”的标签。
[tagname]
(fn [loc]

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

`

0
by
参考: https://clojure.atlassian.net/browse/DZIP-6(由 bpeter 报告)
...