【发布时间】:2014-09-16 09:43:16
【问题描述】:
我需要访问加载的 XML DOM 的内部二进制表示...There are some dump functions,但我看不到“二进制缓冲区”之类的东西(只有“XML 缓冲区”)。
我的最后一个目标是逐字节比较同一个文档,在一些黑盒程序之前和之后,直接与它们的二进制文件(当前和缓存) 表示,没有转换(到 XML 文本表示)...所以,问题,
LibXML2 中有一个二进制表示(内存结构),用于比较 dump 和当前表示?
我只需要检查当前和转储的 DOM 是否相同。
详情
这不是comparing two distinct DOM objects的问题,而是更简单的事情,因为不改变ID等不需要规范表示(!),只需要访问内部表示,因为比转换为文本要快。
在“之前和之后”之间有一个black-box procedure,例如。 XSLT Identity transform 影响(或不影响)某些节点或属性。
替代解决方案...
-
... 为 LibXML2 开发一个 C 函数,逐节点比较两棵树,如果它们不同则返回 false:在树遍历期间,如果树结构发生变化,或者某些 nodeValue 发生变化,则算法停止比较(返回 false)。
-
... 不是理想的,但有助于其他一些算法:如果我可以访问(在 LibXML2 中)节点总数或总长度或size 或 md5 或 sha1... 仅用于优化比较将返回 false 的常见情况(对于我的应用程序),避免完整的比较过程.
注意事项
相关问题
- How to check if a DomDocument was changed with a simple and fast comparison?
- C byte-by-byte comparison
- libxml xmlNodePtr to raw xml string?
对使用已回答解决方案的读者的警告
问题是关于“比较before和after一个back-box操作”,但是这里有两种back-boxes:
- 众所周知且可控的,例如 XSLT 转换或使用已知库。您必须知道您的黑盒不会更改属性顺序或 ID 内容或非规范化空格(或等等)。
- 完全免费的,例如使用外部编辑器(例如 online-editor 更改 XHTML),用户和软件可以在其中执行任何操作。
我将在“众所周知的”黑盒环境中使用解决方案。所以,我在上面“详细信息”部分的 cmets 是有效的。
在“完全免费”后箱的上下文中,您不能使用“二进制转储比较”,因为只有规范表示 (C14N) 才能进行比较。要按 C14N 标准进行比较,只有“替代解决方案”(上文已评论)是可能的。对于alternative-1,您必须在比较一组属性节点之前进行排序。对于替代 2 (also discussed here),生成 C14N 转储。
PS:当然,C14N 标准的使用是主观的,取决于应用程序:如果,p。例如,对于您的应用程序“更改属性顺序”是有效/重要的更改,检测到它的比较是有效的(!)。
【问题讨论】:
-
您知道 XML 是一种 text 格式,因此二进制表示将只是 XML 采用的任何编码的字符序列。
-
@JoachimPileborg,是的,节点是“文本节点”,但是没有(二进制)树表示?我认为有(!)......我没有看到那里(一些图形文档?)这个 主树 的 C 数据结构的名称是什么,与“XML-text转储”。
-
是的,存在二进制表示,如果 XML 是 UTF-8 编码的,则二进制表示是 UTF-8 代码点的序列。例如,二进制表示是什么?
<xml><something attr="5">some data</something></xml>如果不是组成 XML 的字符的二进制表示,也就是字符本身。 -
或者你的意思是 libxml2 使用的实际内存结构?
-
您不能对两个 DOM 文档的内部表示进行逐字节比较来查看它们是否相同。从完全相同的 XML 文档创建的两个 DOM 文档会比较不同,因为内部表示中使用的各种数据位(如指针)特定于特定的 DOM 文档实例。
标签: c comparison libxml2 binary-data