我需要访问加载的XML DOM ... There are some dump functions的内部二进制表示,但我看不到类似“二进制缓冲区”(只有“XML缓冲区”)。
我的最后一个目标是在一些黑盒程序之前和之后逐字节地比较同一文档,直接与它们的二进制文件(当前和缓存)进行比较)表示,没有转换(到XML文本表示)......所以,问题,
LibXML2中有一个二进制表示(内存中结构),用于将转储与当前表示进行比较?
我只需检查当前和转储的DOM是否相同。
这不是comparing two distinct DOM objects的问题,但更简单,因为不更改ID等不需要规范表示(!),只需要访问内部表示,因为它比转换为文本快得多
在“之前和之后”之间有一个black-box procedure,例如。影响(或不影响)某些节点或属性的XSLT Identity transform。
替代解决方案......
...为LibXML2开发一个C函数,逐个节点地比较两棵树,如果它们不同则返回false:在树遍历期间,如果树结构发生变化,或某些nodeValue发生变化,算法停止比较(返回false)。
...不是理想的,但可以帮助其他一些算法:如果我可以访问(在LibXML2中)节点总数或总长度或 size 或 md5 或 sha1 ...仅用于优化频繁案例(对于我的应用程序),其中比较将返回false,从而避免完成比较-程序。
相关问题
使用已解答解决方案的读者警告
问题在于“比较之前与之后的后台操作”,但是这里有两种后台 :
我将在“众所周知的”黑盒的上下文中使用解决方案。因此,我在上面“详细信息”部分的评论是有效的。
在“完全免费”后台的上下文中,您不能使用“二进制转储比较”,因为只有规范表示(C14N)才有效进行比较。为了通过C14N标准进行比较,只有“替代解决方案”(上面评论)是可能的。对于alternative-1,除了其他之外,您必须在比较一组属性节点之前进行排序。对于alternative-2(also discussed here),生成C14N转储。
PS:当然,使用C14N标准是主观的,取决于应用:if,p。例如,对于您的申请,“更改属性顺序”是一个有效/重要的更改,检测它的比较是有效的(!)。
答案 0 :(得分:1)
以下是相关的libxml2方法:
有base64编码方法:
Function: xmlTextWriterWriteBase64 int xmlTextWriterWriteBase64 (xmlTextWriterPtr writer, const char * data, int start, int len) Write an base64 encoded xml text. writer: the xmlTextWriterPtr data: binary data start: the position within the data of the first byte to encode len: the number of bytes to encode Returns: the bytes written (may be 0 because of buffering) or -1 in case of error
和BinHex编码方法:
Function: xmlTextWriterWriteBinHex int xmlTextWriterWriteBinHex (xmlTextWriterPtr writer, const char * data, int start, int len) Write a BinHex encoded xml text. writer: the xmlTextWriterPtr data: binary data start: the position within the data of the first byte to encode len: the number of bytes to encode Returns: the bytes written (may be 0 because of buffering) or -1 in case of error
<强>参考强>