1

我需要传递给在以下 XML 文件中使用 REST API 参数的应用程序

paramValue = "<tag><stillonetag>value</stillonetag></tag>"
xmlIn = '
 <?xml version="1.0" encoding="Windows-1251"?>
 <vco:execution-context xmlns:vco="http://www.vmware.com/vco" xmlns="vco">
     <vco:parameters>
         <vco:parameter name="inputXml" type="string" description="" scope="local">     
             <vco:string>#{paramValue}</vco:string>
         </vco:parameter>
      </vco:parameters>
 </vco:execution-context>
'
xmlExec = xmlIn.gsub(/\>[\s\n\r]+\</, '><')
response = HTTParty.post("/workflows/#{id}/presentation/instances/", { :basic_auth => @auth, :body => xmlExec})

使用“普通”字符串我没有任何问题,但是在这种情况下,参数 inputXML 期望值作为 XML 字符串。如何将这样的 XML 字符串嵌入到上面的 ruby​​ 常量中?提前谢谢了。

4

2 回答 2

0

规则一:不要尝试使用正则表达式处理 HTML 或 XML。他们会让你失眠。

而是使用正确的工具,即 XML 解析器。Nokogiri是我选择的工具:

require 'nokogiri'

xml_in2 = '<?xml version="1.0" encoding="Windows-1251"?>
 <vco:execution-context xmlns:vco="http://www.vmware.com/vco" xmlns="vco">
     <vco:parameters>
         <vco:parameter name="inputXml" type="string" description="" scope="local">     
             <vco:string>put parameter value here</vco:string>
         </vco:parameter>
      </vco:parameters>
 </vco:execution-context>
'

doc = Nokogiri.XML(xml_in2)

doc.at('//vco:string').content = 'new and improved text'

puts doc.to_xml

哪个输出:

<?xml version="1.0" encoding="Windows-1251"?>
<vco:execution-context xmlns:vco="http://www.vmware.com/vco" xmlns="vco">
     <vco:parameters>
         <vco:parameter name="inputXml" type="string" description="" scope="local">
             <vco:string>new and improved text</vco:string>
         </vco:parameter>
      </vco:parameters>
 </vco:execution-context>

或者,插入 XML:

require 'nokogiri'

xml_in2 = '<?xml version="1.0" encoding="Windows-1251"?>
 <vco:execution-context xmlns:vco="http://www.vmware.com/vco" xmlns="vco">
     <vco:parameters>
         <vco:parameter name="inputXml" type="string" description="" scope="local">     
             <vco:string>put parameter value here</vco:string>
         </vco:parameter>
      </vco:parameters>
 </vco:execution-context>
'

doc = Nokogiri.XML(xml_in2)

doc.at('//vco:string').children = '<foo>some<bar>wild and crazy</bar>guys</foo>'

puts doc.to_xml

导致:

<?xml version="1.0" encoding="Windows-1251"?>
<vco:execution-context xmlns:vco="http://www.vmware.com/vco" xmlns="vco">
     <vco:parameters>
         <vco:parameter name="inputXml" type="string" description="" scope="local">
             <vco:string><foo>some<bar>wild and crazy</bar>guys</foo></vco:string>
         </vco:parameter>
      </vco:parameters>
 </vco:execution-context>

编辑:

require 'nokogiri'

xml_in2 = '<?xml version="1.0" encoding="Windows-1251"?>
 <vco:execution-context xmlns:vco="http://www.vmware.com/vco" xmlns="vco">
     <vco:parameters>
         <vco:parameter name="inputXml" type="string" description="" scope="local">     
             <vco:string>put parameter value here</vco:string>
         </vco:parameter>
      </vco:parameters>
 </vco:execution-context>
'

doc = Nokogiri.XML(xml_in2)

doc.at('//vco:string').content = "<tag><stillonetag>value</stillonetag></tag>"

puts doc.to_xml

现在是:

<?xml version="1.0" encoding="Windows-1251"?>
<vco:execution-context xmlns:vco="http://www.vmware.com/vco" xmlns="vco">
     <vco:parameters>
         <vco:parameter name="inputXml" type="string" description="" scope="local">
             <vco:string>&lt;tag&gt;&lt;stillonetag&gt;value&lt;/stillonetag&gt;&lt;/tag&gt;</vco:string>
         </vco:parameter>
      </vco:parameters>
 </vco:execution-context>

# encoding: UTF-8

require 'nokogiri'

xml_in2 = '<?xml version="1.0" encoding="Windows-1251"?>
 <vco:execution-context xmlns:vco="http://www.vmware.com/vco" xmlns="vco">
     <vco:parameters>
         <vco:parameter name="inputXml" type="string" description="" scope="local">     
             <vco:string>put parameter value here</vco:string>
         </vco:parameter>
      </vco:parameters>
 </vco:execution-context>
'

doc = Nokogiri.XML(xml_in2)
doc.encoding = 'UTF-8'

doc.at('//vco:string').content = "<operation>информация</operation>"

puts doc.to_xml

和输出:

<?xml version="1.0" encoding="UTF-8"?>
<vco:execution-context xmlns:vco="http://www.vmware.com/vco" xmlns="vco">
     <vco:parameters>
         <vco:parameter name="inputXml" type="string" description="" scope="local">
             <vco:string>&lt;operation&gt;информация&lt;/operation&gt;</vco:string>
         </vco:parameter>
      </vco:parameters>
 </vco:execution-context>

“魔法线”# encoding: UTF-8告诉 Ruby,脚本中的字符编码是 UTF-8。还有其他可用的编码。在 Ruby v2.0 之前,它假定内容是 ASCII。v2.0+ 采用 UTF-8。

在运行时,Nokogiri 也会假设,直到它尝试解析文档。如果 XML 声明指定了一个字符集,Nokogiri 会假定信息是正确的,并且 XML 中的所有字符都将匹配该信息。XML 是一个严格的规范,因此编码必须与输入的实际字符字节匹配。

在上面的示例中,我告诉 Ruby 和 Nokogiri,我使用的是 UTF-8。XML 文档的声明说它是Win-1251. 因为我使用基于 UTF-8 的系统并粘贴 UTF-8 内容,所以我告诉 Nokogiri 改变对文档编码的理解,方法是使用doc.encoding = "UTF-8"使所有内容保持同步。之后,因为 Ruby、粘贴的字符串和 Nokogiri 一致,所以生成的 XML 将被正确编码。

这很重要的原因是因为必须正确编码某些字符才能使 XML 有效。根据规范,嵌入式标签(通常是 Unicode 字符)不能以原始形式粘贴到文档中,因此 Nokogiri 将它们转换为正确的编码。

尝试手动为一个非常简单的文档执行此操作很容易。随着文档的复杂性增加,或者插入的文本变长,问题会迅速增加。

于 2013-05-22T01:30:58.093 回答
0

知道了!!!!将 XML 文本作为另一个 XML 对象内的 XML 标记的值传递,而不使其成为该对象的一部分

   I need to use &lt; and &gt; instead of < and >.

在我的例子中应该是

   paramValue = "&lt;tag>&lt;stillonetag&gt;value&lt;/stillonetag&gt;&lt;/tag&gt;"

久违了,XML 专家!

于 2013-05-22T09:49:43.327 回答