当前位置:  开发笔记 > 后端 > 正文

REXML保留属性顺序

如何解决《REXML保留属性顺序》经验,为你挑选了2个好方法。

我尝试使用REXML生成这样的XML


  

但我得到的是(注意键/值顺序)


  

码:

require 'rexml/document'
include REXML

doc = Document.new
doc.add_element('root')
el = doc.root.add_element('add')
el.add_attribute('key', 'foo')
el.add_attribute('value', 'bar')
puts doc

如果我写的话没关系:

el.add_attribute('key', 'foo')
el.add_attribute('value', 'bar')

要么

el.add_attribute('value', 'bar')
el.add_attribute('key', 'foo')

结果是一样的.看起来REXML使用一些字典来保存属性......

我可以强制执行所需的订单:键/值吗?



1> paxdiablo..:

在XML中,属性的顺序并不重要.如果你有一些XML处理代码,那么我会建议代码是错误的.

根据此处的XML规范,请注意短语:"请注意,start-tag或empty-element标记中的属性规范的顺序并不重要".

在回答您关于是否可以执行某项订单的具体问题时,我不相信.我从来没有尝试过这样做(因为这是不必要的)但REXML人员似乎不太可能浪费时间实现这样的非功能:-).由于键/值对存储为散列,因此它们的顺序可能是随机的(据您可以从键的字母序列中看出).

当然,由于Ruby附带了REXML的源代码,您可以(如果绝望)用您自己的版本(REXML2?)替换或扩充包含的副本.

由于你正在做一个简单的put,它可能使用漂亮的格式化程序,所以检查write_element代码的开始src/rexml/formatters/pretty.rb执行" node.attributes.each_attribute do |attr|" - 你可能会发现它就像在处理元素之前对列表进行排序一样简单.

您可能还想向开发人员(请参阅此处的邮件列表或此处的错误报告和增强请求)建议他们在将来的版本中将其作为选项,但是,如果我是他们,我只是说这是不必要的.


当然,从机器角度来看,订单无关紧要.我需要它只是为了可读性.实际上我必须修改配置文件,并希望尽可能保留格式.

2> gioele..:

您可以尝试使用ad-hoc REXML::Formatter,而无需触及REXML源.关于ruby-talk ml的帖子建议使用以下代码:

class OrderedAttributes < REXML::Formatters::Pretty
    def write_element(elm, out)
        att = elm.attributes

        class <

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有