【问题标题】:Passing-through unknown XML elements in a SAX parser在 SAX 解析器中传递未知 XML 元素
【发布时间】:2008-10-30 16:34:30
【问题描述】:

我正在从 XML 文档加载一些数据,对其进行修改,然后写回 XML。读取是使用 SAX 解析器库完成的,而写入是使用一段自定义代码完成的。有时,文件会在外部进行修改,并添加额外的元素(例如对样式表的引用)。我不想在加载和保存文件时丢失这些额外的元素,我想通过任何未知的标签,以便它们出现

当未知元素与解释元素分开时,将未知元素和属性保存为字符串并在之后输出它们应该很简单,但是当它们散布并嵌套在解释元素中时,它就变得不那么明显了。

谁能建议一个简洁的方法来做到这一点?切换到 DOM 解析器会更简单吗?性能不是问题。

注意。我正在使用 Gnome Glib::Markup::Parser 使用 C++,但更喜欢与语言/库无关的答案。

【问题讨论】:

    标签: xml sax


    【解决方案1】:

    我不知道您是如何编写内容处理程序的,但它的方法应该在所有事件上调用,包括您想要保留的外部修改。您的startElement()endElement() 回调可以测试元素名称和属性以决定是否对要修改的元素调用专门的方法,但默认情况下只是重建并输出调用回调的事件。这样一来,您没有专门处理的任何元素都会默认获得输出。

    您也可以在 XSLT 中做同样的事情。进行身份转换(一个样式表,它准确地输出输入的内容)并向其添加具有更具体匹配表达式的模板,以进行自定义修改。对于大多数应用程序,我发现 XSLT 比 SAX 或 DOM 更易于使用。

    【讨论】:

      【解决方案2】:

      当您想要修改 xml 文件并在更改后将其保存回其他文件时,我认为 SAX 不是正确的方法。 我的建议是使用 DOM。它将加载整个文件(包括外部所做的修改),因此您只需要考虑您想要做什么。之后保存时,一切都会恢复原状。

      【讨论】:

        猜你喜欢
        • 2013-11-08
        • 2014-02-27
        • 1970-01-01
        • 2011-03-25
        • 2011-05-31
        • 1970-01-01
        • 2012-08-27
        • 1970-01-01
        • 2017-08-19
        相关资源
        最近更新 更多