LibXML2中有“二进制转储”或“获取二进制表示”function?

我需要访问加载的XML DOM的内部二进制表示… 有一些转储函数 ,但我没有看到类似“二进制缓冲区”(只有“XML缓冲区”)。

我的最后一个目标是在一些黑盒程序之前和之后逐字节地比较同一文档 ,直接用它们的二进制(当前和缓存)表示,而不转换(到XML文本表示)……所以,这个问题,

LibXML2中有一个二进制表示(内存中结构),用于将转储与当前表示进行比较?

我只需要检查当前和转储的DOM是否相同。


细节

这不是比较两个不同DOM对象的问题 ,而是更容易的事情,因为不更改ID等不需要规范表示(!),只需要访问内部表示,因为它比转换为文本快得多。

在“之前和之后”之间有一个黑盒程序 ,例如。 影响(或不影响)某些节点或属性的XSLT Identity转换 。

替代解决方案

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

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


笔记

相关问题

  • 如何通过简单快速的比较来检查是否更改了DomDocument?
  • C逐字节比较
  • libxml xmlNodePtr到原始xml字符串?

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

问题是“在之前与后箱操作之后进行比较”,但这里有两种后箱

  • 众所周知且可控的,如XSLT转换或使用已知库。 您必须知道您的黑盒子不会更改属性顺序或ID内容或非空化(或等)空格。
  • 完全免费的,例如使用外部编辑器(例如在线编辑器更改XHTML),用户和软件可以做任何事情。

我将在“众所周知的”黑盒子的背景下使用解决方案 。 因此,我在上面“详细信息”部分的评论是有效的。

在“完全免费”后台的上下文中,您不能使用“二进制转储的比较”,因为只有规范表示(C14N)才有效进行比较。 为了通过C14N标准进行比较,只有“替代解决方案”(上面评论)是可能的。 对于alternative-1,除了其他之外,您必须在比较一组属性节点之前进行排序。 对于alternative-2( 也在这里讨论 ),生成C14N转储。

PS:当然,使用C14N标准是主观的,取决于应用 :if,p。 例如,对于您的应用,“更改属性顺序”是一个有效/重要的更改,检测它的比较是有效的(!)。

以下是相关的libxml2方法:

有一个base64编码方法:

function:xmlTextWriterWriteBase64

 int xmlTextWriterWriteBase64(xmlTextWriterPtr writer, 
                      const char *数据, 
                      int start, 
                      int len)

编写base64编码的xml文本。
 writer:xmlTextWriterPtr
数据:二进制数据
 start:要编码的第一个字节的数据内的位置
 len:要编码的字节数
返回:写入的字节(由于缓冲可能为0)或出错时为-1

和BinHex编码方法:

function:xmlTextWriterWriteBinHex
 int xmlTextWriterWriteBinHex(xmlTextWriterPtr writer, 
                      const char *数据, 
                      int start, 
                      int len)

编写BinHex编码的xml文本。
 writer:xmlTextWriterPtr
数据:二进制数据
 start:要编码的第一个字节的数据内的位置
 len:要编码的字节数
返回:写入的字节(由于缓冲可能为0)或出错时为-1

参考

  • 来自libxml2的模块xmlwriter

  • ChangeLog libxml2的最后一项

  • Gnome的XML C解析器和工具包:libxml2的API字母索引AB

  • libxml编码支持

  • binhex.py