加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails Builder.生成没有实体的XML输出

发布时间:2020-12-16 19:13:54 所属栏目:百科 来源:网络整理
导读:如何使Builder不编码’???’和其他此类字符. 我想要的是’ca?o??’字面上用 XML文档打印. 例: xml.instruct! :xml,:version = '1.0',:encoding = 'utf-8'xml.Trader( :'xmlns:xsi' = "http://www.w3.org/2001/XMLSchema-instance",:'xmlns:xsd' = "http://w
如何使Builder不编码’???’和其他此类字符.
我想要的是’ca?o??’字面上用 XML文档打印.
例:
xml.instruct! :xml,:version => '1.0',:encoding => 'utf-8'
xml.Trader( :'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance",:'xmlns:xsd' => "http://www.w3.org/2001/XMLSchema") do
  xml.Informacje do
    xml.RodzajPaczki 'ca?o??'
    xml.Program 'mine'
    xml.WersjaProgramu '1.0'
  end
end

输出:

<?xml version="1.0" encoding="utf-8"?> 
<Trader xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
 <Informacje>  
  <RodzajPaczki>ca&#322;o&#347;&#263;</RodzajPaczki> 
    <Program>mine</Program> 
    <WersjaProgramu>1.0</WersjaProgramu> 
  </Informacje>
</Trader>

CA&安培;#322;的O&#347;&安培;#263;应该是ca?o??.
我看到像xml.RodzajPaczki {| t |的伪解决方案t<< 'ca?o??'}但它无法正常工作.它在文件的左侧突出'ca?o??'.

解决方法

这是正在发生的事情.正如我们所知,默认情况下,Builder将转义非ca字符,例如ca?o??中的字符.您还提到了一种可能的方法来解决它,那就是:
xml.RodzajPaczki {|t| t << 'ca?o??' }

不幸的是,当你将一个块传递给RodzajPaczki元素时,Builder假定会有一些内部xml,所以它会添加一个新行并应用缩进.当然在我们的例子中只有内部文本而没有xml,所以我们得到一些难看的输出,如:

<RodzajPaczki>
ca?o??      </RodzajPaczki>

有一种简单的方法和更难以解决这个问题的方法.首先是简单的方法.

将缩进配置为零

然后你可以使用上面的修复xml.RodzajPaczki {| t | t<< 'ca?o??'}一切都会按预期工作,但输出不会打印得很漂亮,实际上一切都在一条线上:

<?xml version="1.0" encoding="UTF-8"?><Trader xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Informacje><RodzajPaczki>ca?o??</RodzajPaczki><Program>mine</Program><WersjaProgramu>1.0</WersjaProgramu></Informacje></Trader>

如果您希望它格式良好,您可以通过外部漂亮的打印机运行它.

如果你只需要漂亮的打印输出并且不需要转义,我们需要稍微修改Builder.这是解决此问题的难点.

修补生成器

我们需要修补XmlMarkup对象的初始化器以添加一个额外的选项:escape.同时我们修补XmlBase对象以将此新选项作为参数.我们将此新选项默认为true,以维护默认行为.然后我们修补文本! XmlBase上的方法使用我们的新选项来决定是否应该转义not的文本.这是它的样子:

module Builder
  class XmlBase
    def initialize(indent=0,initial=0,encoding='utf-8',escape=true)
      @indent = indent
      @level  = initial
      @encoding = encoding.downcase
      @escape = escape
    end

    def text!(text)
      if @escape
        _text(_escape(text))
      else
        _text(text)
      end
    end
  end

  class XmlMarkup
    def initialize(options={})
      indent = options[:indent] || 0
      margin = options[:margin] || 0
      encoding = options[:encoding] || 'utf-8'
      escape = options[:escape]
      if escape == nil
        escape = true
      end
      super(indent,margin,encoding,escape)
      @target = options[:target] || ""
    end
  end
end

我们现在可以按以下方式使用我们新修补的构建器(请注意,当我们构造XmlMarkup对象时,我们传入new:escape选项,其值为false):

xml = Builder::XmlMarkup.new(:target=>STDOUT,:indent=>3,:encoding => 'utf-8',:escape => false)
xml.instruct! :xml,:encoding => 'UTF-8'
xml.Trader(:'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance",:'xmlns:xsd' => "http://www.w3.org/2001/XMLSchema") do 
  xml.Informacje do
    xml.RodzajPaczki('ca?o??')
    xml.Program('mine')
    xml.WersjaProgramu('1.0')
  end
end

输出如下:

<?xml version="1.0" encoding="UTF-8"?>
<Trader xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <Informacje>
      <RodzajPaczki>ca?o??</RodzajPaczki>
      <Program>mine</Program>
      <WersjaProgramu>1.0</WersjaProgramu>
   </Informacje>
</Trader>

根据需要,文本不会被转义.请注意,修补程序会将此非转义行为应用于所有文本,因此,如果您只希望某些文本不转义而其他文本仍然转义,则需要更大程度地修补Builder.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读