Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何防止XMLSerializer.serializeToString()对属性重新排序?_Javascript_Xml_Xml Serialization_Lxml - Fatal编程技术网

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

Javascript 如何防止XMLSerializer.serializeToString()对属性重新排序?,javascript,xml,xml-serialization,lxml,Javascript,Xml,Xml Serialization,Lxml,我使用jQuery将任意XML字符串(较大文档的片段)加载到浏览器DOM中并对其进行操作,然后使用XMLSerializer将其加载回字符串并发送回服务器,在服务器上对其进行处理(通过python和lxml)并重新集成到完整的XML文档中 XML在git存储库中开始和结束。我发现XMLSerializer处理的元素上的属性按顺序颠倒,导致存储库中出现虚假更改,如下所示: - <literal><token kind="w" id="en-us-esv-xeaugcbzgo"&g

我使用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规范,“开始标记或空元素标记中属性规范的顺序并不重要”:。可以说,属性的顺序对我很重要。:)

如果这很重要,那么问题不在于属性的重新排序,而在于它的重要性。让它随心所欲地订购,并修复错误

编辑:

等一下。为什么要将其放入存储库?如果它是输出而不是源,那么它在存储库中的值是作为未编辑的资源而不是源的,并且它的存储是为了方便。否则,你为什么让计算机进程改变它


这类似于将二进制文件放入存储库,其原因与通常不好的原因相同,也与产生异常的原因相同。

我已经按照@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))

我的基于线的差异再次有用

看起来,属性最终是按字母顺序排列的。你就不能把它定为惯例吗?也许操纵XML的Python代码中的一个小改动会使它们立即以“正确”的顺序出现?这可能就是我最后要做的。非常不方便的是,我的XML操作工具(lxml,libxml2的python包装器)没有将属性排序视为重要的(并且正确地如此!)。因此,我对上述问题进行了编辑。SCMs通常是面向行的,不幸的是,目前还没有任何SCM系统能够“理解”XML,以至于能够忽略XML中无关紧要的内容。因此,定义两个XML文件是否“相同”可能取决于数据的语义。@Jim,那么XML不是要使用的输出。这不是一个bug,只是一个方便的问题:属性的重新排序掩盖了应用于数据的其他有意义的更改。XML是否是正确的输出,或者它是否属于存储库,都超出了问题的范围。