我正在使用jQuery将任意XML字符串(较大文档的片段)加载到浏览器DOM中并对其进行操作,然后使用XMLSerializer将它们加载回字符串并将它们发送回服务器,在那里对它们进行处理(通过python和lxml)并重新集成到一个完整的XML文档中。
XML在git存储库中开始和结束。我发现XMLSerializer处理的元素的属性按顺序颠倒,导致我的存储库中出现虚假的变化,如下所示:
- <literal><token kind="w" id="en-us-esv-xeaugcbzgo">sent</token><token kind="s" id="en-us-esv-xeaugcbzgw"> </token></literal>
+ <literal><token id="en-us-esv-xeaugcbzgo" kind="w">sent</token><token id="en-us-esv-xeaugcbzgw" kind="s"> </token></literal>
这不是我正在使用的任何工具的错误。当然,xml元素上的属性顺序不应该重要。 但是,因为git是一个面向行的SCM,这些虚假和微不足道的变化会分散我想跟踪的实际实质性变化。
问题:有没有办法阻止序列化程序重新排序我的属性?或者,是否存在任何工具来指定/约束属性的排序?
为了清晰起见,在上面编辑:我知道,根据XML规范,“start-tag或empty-element标记中的属性规范的顺序并不重要”:{{3 }}。可以这么说,属性的排序对我很重要。:)
答案 0 :(得分:1)
如果这很重要,那么错误不是重新排序属性,而是重要的。让它按照它想要的顺序排序,并修复bug。
编辑:
等一下。为什么要将它放入存储库?如果它是输出而不是源,那么它在存储库中的值是作为非编辑资源而不是源,并且存储为方便。否则,你为什么要让计算机进程改变呢?
这类似于将二进制文件放入存储库,其原因与错误相同,以及制作异常的原因相同。
答案 1 :(得分:0)
我采取了@Tomalak建议的方向,正在“修理”订单服务器端。值得庆幸的是,原始顺序是按字母顺序排列的,XMLSerializer生成的顺序是反向字母顺序。我的服务器端XML工具lxml维护文档属性顺序,因此反转顺序很简单:
xmls = json.loads(self.data['xmls'])
out = []
for xml in xmls:
# DOM adds an XHTML namespace... silly DOM.
xml = xml.replace('xmlns="http://www.w3.org/1999/xhtml"', '')
tree = ET.fromstring(xml)
for el in tree.xpath('//*'):
attrs = dict(el.attrib)
keys = el.attrib.keys() # el.attrib preserves attribute order
keys.reverse() # But the browser DOM has reversed that order.
# Put them back in the order we want.
el.attrib.clear()
for k in keys:
el.attrib[k] = attrs[k]
out.append(ET.tostring(tree, encoding=unicode))
我的基于行的差异再次有用!