我的情况是两种不同的机制正在处理XML数据。在一个地方,它使用Python的xml.dom.minidom库进行处理。另一方面,通过XmlTextWriter在.NET中执行类似的处理。
在Python代码生成的输出中,空元素被写入< ElementName /> (元素关闭前没有空格)。在.NET代码中,正在插入一个空格(导致< ElementName />)。这与XML的有效性或含义没有任何区别,但它确实会在比较两个输出时检测到输出不同。
有没有办法告诉XmlTextWriter不要包含多余的空间?如果不这样做,是否有任何方法可以在Python生成的输出中包含额外的空间(没有弄乱库源,这可能是我认为不可取的; - ))?
更新:也许我应该解释一下我正在尝试做什么,而不仅仅是描述问题。我可能会让事情变得更加复杂/痛苦。
我真正需要的是一些机制来确定XML所代表的结构尚未被修改。我最初是扁平化XML(当在.NET世界中完成所有事情时消除了空白问题),然后计算数据的适当盐渍哈希值。我能/应该使用更好的机制吗?
答案 0 :(得分:5)
可能不是您所追求的答案:不要将XML输出与纯文本进行比较。我们这样做是为了我们的单元测试(两个通过xml消息进行通信的应用程序),它很脆弱,易于破解,烦人且需要大量维护。你应该解析xml输出并比较结构 - 编写这样的工具需要做更多的工作(也许有一个alrady)但是当输出在任何库的下一个版本中再次稍微改变时它仍然可以工作
编辑:好了,既然你已经解释了一下你的问题了,那么让我看看我是否理解它:你有一些数据用于创建XML输出。有时通过.NET,有时通过Python。假设您通过.NET创建输出,然后计算其上的哈希并存储它。稍后您通过Python生成输出,该输出应该具有相同的内容,您还可以为它计算哈希值。由于白色空间问题,现在两个哈希值不相等。
如果是这种情况,您可以遍历XML文档并根据看到的节点及其属性和值计算哈希值。一种更简单的方法是从输出中去除所有不相关的空格(无论输出来自何处),然后进行哈希计算。你can do that in Python;)
答案 1 :(得分:1)
如果您将Indent
中的XmlWriterSettings
属性设置为true
,则会发现问题只会出现。 Indent == false
时,没有插入空格。但是如果你想要缩进,你就必须和那个空间一起生活。
因此,您的程序的解决方案是关闭两个工具中的缩进吗?
这很不幸,因为几乎可能会改变这种行为。
XmlWriter
的实现实际上会调用XmlWriterSettings.CreateWriter
根据您传递的设置创建一个编写器。如果Indent == true
,则会创建XmlEncodedRawTextWriterIndent
,这是一个派生自抽象XmlWriter
的内部类。它会覆盖WriteFullEndElement
并插入该空格。
理论上,您可以创建自己的派生自XmlEncodedRawTextWriterIndent
的类,该类会覆盖WriteFullEndElement
。如果你能做到这一点,就很容易防止缩进。但是你不能这样做,因为它是internal
类(System.Xml
的内部)。即使你可以继承XmlEncodedRawTextWriterIndent
,你也会遇到XmlWriterSettings.CreateXmlWriter
没有办法实例化你的类的问题,而XmlWriterSettings
是sealed
。
我想有充分的理由可以有效地阻止自定义XmlWriter
课程的创建,尽管他们此刻逃避了。
答案 2 :(得分:0)
我只是对输出进行后处理以进行搜索/替换,而不是试图弄乱库
答案 3 :(得分:0)
如果您只是在寻找文件完整性,那么该文件的MD5(或类似内容)是否足够?
答案 4 :(得分:0)
将xml文件与XMLUnit库进行比较。这个库有java和.net