请分享您的看法,参与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

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 "使用 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](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
by

评论者:bzg

说到这件事,我也刚受到这个回归的影响。
希望可以尽快发布一个合适的修复!提前感谢。

0
by

评论者:bpeter

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

0
by

评论者:pdlug

这个问题的更新?我们也在遇到这个错误。

0
by

评论者:pdlug

根据Benjamin Peter的建议,当我们复制{{tag=}}的最新实现而不带{{or}}部分时,这对我们来说在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
by
...