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

运行了包含 2 个断言的 1 个测试。
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)))))

`

似乎在我的情况中,在 {{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 "<p>

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}}部分,我们在0.2.0-alpha2时通过复制最新的{{tag=}}实现来解决这个问题,这为我们工作。我不确定在这里最好的修复方案是什么,似乎很难整合先前补丁以允许匹配根元素,显然匹配子元素是一个更常见的用例,因此可能更倾向于使用{{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
...