【发布时间】:2018-05-22 13:24:25
【问题描述】:
我有一个类似的 XML:
<response xmlns:msg="http://schemas.xyzlabs.net/2010/messaging/" xmlns:ld="http://schemas.xyzlabs.net/2010/lab-data/">
<msg:trb proRefId="12345" tesComNa="Xyz Laboratories,Inc.">
<sample ttz="020206b01" id="1898-57" name="Adam, Franklin" />
</msg:trb>
</response>
我应该在 ruby 中读取 XML,并在 UI(文本区域内)中以可读性强的 HASH 格式显示它,用户可以在其中编辑 HASH 中的值。
然后我应该从哈希中重新生成 XML。
但是,初始 XML 和最终 XML 不同
代码
XML > 哈希
h = Hash.from_xml('
<response xmlns:msg="http://schemas.xyzlabs.net/2010/messaging/" xmlns:ld="http://schemas.xyzlabs.net/2010/lab-data/">
<msg:trb proRefId="12345" tesComNa="Xyz Laboratories,Inc.">
<sample ttz="020206b01" id="1898-57" name="Adam, Franklin" />
</msg:trb>
</response>
')
输出
#{
# "response" => {
# "xmlns:msg"=>"http://schemas.xyzlabs.net/2010/messaging/",
# "xmlns:ld"=>"http://schemas.xyzlabs.net/2010/lab-data/",
# "trb" => {
# "proRefId" => "12345",
# "tesComNa" => "Xyz Laboratories,Inc.",
# "sample" => {
# "ttz" => "020206b01",
# "id" => "1898-57",
# "name" => "Adam, Franklin"
# }
# }
# }
#}
假设用户修改了上述内容,我正在尝试将修改后的 HASH 再次转换为 XML:
哈希 > XML
h["response"].to_xml(root: "response")
输出
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<response>
<xmlns:msg>
http://schemas.xyzlabs.net/2010/messaging/
</xmlns:msg>
<xmlns:ld>
http://schemas.xyzlabs.net/2010/lab-data/undefined
</undefinedxmlns:ld>
undefined
<trb>
<proRefId>12345</proRefId>
<tesComNa>Xyz Laboratories,Inc.</tesComNa>
<sample>
<ttz>020206b01</ttz>
<id>1898-57</id>
<name>Adam, Franklin</name>
</sample>
undefined
</trb>
undefined
</response>
我看到很多undefined,并且任何节点的属性都会转换为节点本身。
如何在仅修改其各自值的情况下恢复原始 XML(由用户完成)?
【问题讨论】:
-
是的,我在这里看不到简单的方法,因为哈希不能在键上具有属性。这就是为什么 xml->hash 转换使它们成为单独的键值对,而这些键值对又正确地成为独立的标签。
-
@SergioTulentsev 另外,另一个问题是,如果任何标签有文本,例如:
<sample ttz="020206b01" id="1898-57" name="Adam, Franklin">Some Text</sample>,那么转换成 HASH 会跳过属性 -
这是一个普遍的问题:数据从一个数据模型 A 到另一个模型 B 的转换是不可逆的,除非这两个数据模型是同构的。要么 A 中的两个值在 B 中具有相同的表示形式,要么 B 中的两个值在 A 中具有相同的表示形式。您的问题在数学上是无法解决的。
标签: ruby-on-rails ruby xml hash