【问题标题】:There are a "binary dump" or "get binary representation" function in LibXML2?LibXML2 中有“二进制转储”或“获取二进制表示”功能吗?
【发布时间】: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 影响(或不影响)某些节点或属性。

替代解决方案...

  1. ... 为 LibXML2 开发一个 C 函数,逐节点比较两棵树,如果它们不同则返回 false:在树遍历期间,如果树结构发生变化,或者某些 nodeValue 发生变化,则算法停止比较(返回 false)。

  2. ... 不是理想的,但有助于其他一些算法:如果我可以访问(在 LibXML2 中)节点总数总长度sizemd5sha1... 仅用于优化比较将返回 false 的常见情况(对于我的应用程序),避免完整的比较过程.


注意事项

相关问题

对使用已回答解决方案的读者的警告

问题是关于“比较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


【解决方案1】:

以下是相关的 libxml2 方法:

base64编码方式:

函数:xmlTextWriterWriteBase64 int xmlTextWriterWriteBase64(xmlTextWriterPtr 写入器, 常量字符 * 数据, 诠释开始, 国际化) 编写 base64 编码的 xml 文本。 作家:xmlTextWriterPtr 数据:二进制数据 start:要编码的第一个字节在数据中的位置 len:要编码的字节数 返回:写入的字节数(可能是 0,因为缓冲)或 -1 以防出错

还有一个BinHex编码方式:

函数:xmlTextWriterWriteBinHex int xmlTextWriterWriteBinHex (xmlTextWriterPtr writer, 常量字符 * 数据, 诠释开始, 国际化) 编写 BinHex 编码的 xml 文本。 作家:xmlTextWriterPtr 数据:二进制数据 start:要编码的第一个字节在数据中的位置 len:要编码的字节数 返回:写入的字节数(由于缓冲可能为 0)或 -1 以防出错

参考文献

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-30
    • 2011-03-24
    • 2012-06-17
    • 2017-06-05
    • 2019-02-04
    • 1970-01-01
    • 2021-12-21
    • 2021-10-06
    相关资源
    最近更新 更多