- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我使用 XML-conduit 构建了一个 GPX 解析器并且在识别元素和跳过不需要的标签时遇到了过于冗长和脆弱的代码问题。
识别元素(一个小麻烦)
我通过仅比较 nameLocalName
来明确忽略 namespace 。我想正确的方法是将正确的命名空间硬编码到程序中,并让助手构造我的元素名称以便在 tag*
函数中进行比较?这有点烦人,因为我必须支持至少两个不同的 namespace (GPX 1.1 和 1.0),它们非常相似,我的使用不需要更改代码。
跳过元素
GPX 较大,自定义扩展集较大。因为我正在构建的工具需要的信息有限,所以我决定忽略特定标签及其所有子元素。例如:
<trkpnt lat="45.19843" lon="-122.428">
<ele>4</ele>
<time>...</time>
<extensions>
...
</extensions>
</trkpnt>
为了忽略 extensions
和带有大量子元素的类似标签,我制作了一个接收器,它会消耗元素直到结束元素 Event
:
skipTagAndContents :: (MonadThrow m) => Text -> Sink Event m (Maybe ())
skipTagAndContents n = tagPredicate ((== n) . nameLocalName)
ignoreAttrs
(const $ many (skipElements n) >> return ())
skipElements t = do
x <- await
case x of
Just (EventEndElement n) | nameLocalName n == t -> Done x Nothing
Nothing -> Done x Nothing
_ -> return (Just ())
似乎应该有一个 tag*
变体可以为我做这件事(在没有所有 child 被消耗的情况下成功)但是没有这个事实表明我缺少一个简单的组合器或者应该发送补丁 - 这是什么?
最佳答案
如果您根本不使用命名空间,使用 Data.Conduit.List.map stripNamespace
之类的东西将它们完全剥离可能是最简单的。
坦率地说,我并没有真正使用自己经常使用的流媒体界面;我几乎所有的工作都涉及 DOM (Text.XML
) 或游标界面。所以完全有可能缺少组合器。但在这种情况下,我相信您可以大大简化实现,因为 tagPredicate
不应允许内部 Sink
读取元素末尾之后的内容。所以你可以重写 skipTagAndContents
为:
tagPredicate ((== n) . nameLocalName) ignoreAttrs (const Data.Conduit.List.sinkNull)
你应该在把它放进去之前测试一下,我可能会错误地记住流接口(interface)的一些细节。
关于xml - 使用 xml-conduit 的脆弱和冗长的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10875179/
我有一些记录到标准输出的测试,我想根据 nose 运行的冗长程度更改我的测试脚本中的日志级别。 如何从正在运行的测试之一中访问 running nose 实例的详细信息? 最佳答案 这有点 hack,
我们正在尝试序列化一个对象树。虽然我们已经成功了。我希望找到一种方法来简化生成的 xml。 对象看起来像下面这样: public class RuleSet { public IEnumera
查看 git-config 变量和 git-pull 文档,我没有看到默认情况下使 git-pull pull 冗长的方法。有人知道方法吗? 最佳答案 并不是所有的配置参数都适用!但是您可以使用别名自
我有一个小型或中等规模的 F# 项目,15 个 *.fs 文件,大约 2000 行代码。编译突然有点慢,大约5秒。我想找出导致编译速度变慢的原因,但找不到像“详细”这样的 fsc 开关,导致它显示进度
许多 scikit-learn 函数都有一个 verbose 参数,根据他们的文档,“[c]控制详细程度:越高,消息越多”(例如,GridSearchCV)。 很遗憾,没有提供关于允许使用哪些整数(例
我正在尝试以旧方式运行 Rails 测试,即以点作为输出,但我认为我遗漏了一些东西。我找不到在哪里关闭冗长模式,每次我运行 rake 任务时,我都会得到一个测试描述列表,这些描述起初看起来不错,但最终
我是一名优秀的程序员,十分优秀!