如何防止XMLSerializer.serializeToString()重新排序属性?

时间:2010-08-23 21:39:20

标签: javascript xml xml-serialization lxml

我正在使用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 }}。可以这么说,属性的排序对我很重要。:)

2 个答案:

答案 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))

我的基于行的差异再次有用!