如何转义 ' : ' 使用 Ruby Gem Builder::XmlMarkup
How to escape ' : ' using Ruby Gem Builder::XmlMarkup
我是一名 ruby 初学者,我需要用 csv 创建一个 xml 文档,然后将其发送给我的供应商。
我发现 gem Builder::XmlMarkup 非常有用。到目前为止,我的代码如下所示:
require 'csv'
require 'builder'
File.open("testXML.xml","w"){|f|
builder = Builder::XmlMarkup.new(:target => f, :indent => 2)
builder.instruct! :xml, :standalone=>"yes"
csv = CSV.open('test.csv','rb',:headers=>true)
csv2 = CSV.open('test.csv','rb',:headers=>true)
builder.SupplierFile("xmlns:ns2"=>"http://impl.ws.tediber.com", "xmlns:ns1" =>
"http://obj.ws.tediber.com", "xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance"){
builder.Credit{#, "upgnr"=>"12345"
builder.CreditList do |b|
csv2.each do |csv|
column = csv[0].split(",")
builder.Refund("id"=>"#{column[0]}") do |b|
builder.ns2:doCredit do |b|
b.ns2invoiceID("#{column[0]}")
builder.ns2:payment do |b|
b.ns1amount("#{column[2]}")
b.ns1currency("#{column[3]}")
b.ns1action("#{column[4]}")
b.ns1mode("#{column[5]}")
b.ns1contract("#{column[6]}")
end
b.ns2comment("#{column[7]}")
end
end
end
end
}
}
}
但是我需要一个像 <ns1:currency>
那样的 xml 格式而不是 <ns1currency>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SupplierFile xmlns:ns2="http://impl.ws.tediber.com" xmlns:ns1="http://obj.ws.tediber.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Credit>
<CreditList>
<Refund id="10006144909513">
<ns2:doCredit>
<ns2:invoiceID>10006144539513</ns2:transactionID>
<ns2:payment>
<ns1:amount>8900</ns1:amount>
<ns1:currency>978</ns1:currency>
<ns1:action>8900</ns1:action>
<ns1:mode>AAA</ns1:mode>
<ns1:contract>HZW_1202</ns1:contractNumber>
</ns2:payment>
<ns2:comment>Invoice_EUR_10006144909513</ns2:comment>
</ns2:doCredit>
</Refund>
</CreditList>
</CreditList>
</SupplierFile>
当我尝试以下代码时,由于“:”
而无法正常工作
b.ns1:amount("#{column[2]}")
b.ns1:currency("#{column[3]}")
b.ns1:action("#{column[4]}")
b.ns1:mode("#{column[5]}")
b.ns1:contract("#{column[6]}")
我设法得到 xml 但没有“:”
有没有在我的代码中添加“:”的解决方案?
根据 its documentation,看起来 Builder::XmlMarkup
允许您使用 #tag!
方法定义带有不寻常符号的标签,该方法将标签名称作为第一个参数。
请看看这是否有效:
b.tag!("ns1:amount", "#{column[2]}")
.
编辑:似乎还有一种更简单的方法来创建 XML 命名空间。你还需要为它提供两个参数,但是这样:
b.ns1(:amount, "#{column[2]}")
# or without parens:
b.ns1 :amount, "#{column[2]}"
我是一名 ruby 初学者,我需要用 csv 创建一个 xml 文档,然后将其发送给我的供应商。 我发现 gem Builder::XmlMarkup 非常有用。到目前为止,我的代码如下所示:
require 'csv'
require 'builder'
File.open("testXML.xml","w"){|f|
builder = Builder::XmlMarkup.new(:target => f, :indent => 2)
builder.instruct! :xml, :standalone=>"yes"
csv = CSV.open('test.csv','rb',:headers=>true)
csv2 = CSV.open('test.csv','rb',:headers=>true)
builder.SupplierFile("xmlns:ns2"=>"http://impl.ws.tediber.com", "xmlns:ns1" =>
"http://obj.ws.tediber.com", "xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance"){
builder.Credit{#, "upgnr"=>"12345"
builder.CreditList do |b|
csv2.each do |csv|
column = csv[0].split(",")
builder.Refund("id"=>"#{column[0]}") do |b|
builder.ns2:doCredit do |b|
b.ns2invoiceID("#{column[0]}")
builder.ns2:payment do |b|
b.ns1amount("#{column[2]}")
b.ns1currency("#{column[3]}")
b.ns1action("#{column[4]}")
b.ns1mode("#{column[5]}")
b.ns1contract("#{column[6]}")
end
b.ns2comment("#{column[7]}")
end
end
end
end
}
}
}
但是我需要一个像 <ns1:currency>
那样的 xml 格式而不是 <ns1currency>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SupplierFile xmlns:ns2="http://impl.ws.tediber.com" xmlns:ns1="http://obj.ws.tediber.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Credit>
<CreditList>
<Refund id="10006144909513">
<ns2:doCredit>
<ns2:invoiceID>10006144539513</ns2:transactionID>
<ns2:payment>
<ns1:amount>8900</ns1:amount>
<ns1:currency>978</ns1:currency>
<ns1:action>8900</ns1:action>
<ns1:mode>AAA</ns1:mode>
<ns1:contract>HZW_1202</ns1:contractNumber>
</ns2:payment>
<ns2:comment>Invoice_EUR_10006144909513</ns2:comment>
</ns2:doCredit>
</Refund>
</CreditList>
</CreditList>
</SupplierFile>
当我尝试以下代码时,由于“:”
而无法正常工作b.ns1:amount("#{column[2]}")
b.ns1:currency("#{column[3]}")
b.ns1:action("#{column[4]}")
b.ns1:mode("#{column[5]}")
b.ns1:contract("#{column[6]}")
我设法得到 xml 但没有“:”
有没有在我的代码中添加“:”的解决方案?
根据 its documentation,看起来 Builder::XmlMarkup
允许您使用 #tag!
方法定义带有不寻常符号的标签,该方法将标签名称作为第一个参数。
请看看这是否有效:
b.tag!("ns1:amount", "#{column[2]}")
.
编辑:似乎还有一种更简单的方法来创建 XML 命名空间。你还需要为它提供两个参数,但是这样:
b.ns1(:amount, "#{column[2]}")
# or without parens:
b.ns1 :amount, "#{column[2]}"