从行创建XML元素

时间:2011-12-28 08:16:31

标签: xml postgresql

背景

表格(equipment_group [例如])包括各种设备类别:

bakeware
cookware
kitchenware
utensils

问题

值必须是编码的XML元素,例如:

xmlelement( name eg.label )

每个元素可以有多个对象,如以下XML片段所示:

<equipment>
  <bakeware>
    <object min-quantity="20">ramekin</object>
    <object alias="pan">shallow baking pan</object>
  </bakeware>
  <cookware>
    <object alias="pot">medium pot</object>
  </cookware>
  <utensils>
    <object alias="torch">kitchen butane torch</object>
    <object alias="sieve">fine-mesh sieve</object>
    <object alias="whisk">wire whisk</object>
  </utensils>
</equipment>

更新

乍一看,好像可以使用xmlconcat,但xmlconcat只允许平衡的XML。也就是说,似乎不可能做到以下几点:

xmlconcat( '<a>', '<b />', '</a>' )

这是格式良好的XML,但是xmlconcat会引发错误:

ERROR:  invalid XML content
LINE 1: select xmlconcat( '<a>', '<b/>', '</a>' );
                          ^
DETAIL:  Entity: line 1: parser error : Premature end of data in tag a line 1

问题

如何创建名称使用表格数据填充的XML元素?

谢谢!

1 个答案:

答案 0 :(得分:1)

由于xmlconcat仅接受格式良好的XML参数,因此一个选项是创建所需元素的子查询,如下所示:

  xmlelement( name "bakeware",
    xmlconcat(
      array_to_string( array_agg(
        xmlelement( name "object",
          xmlattributes( e.abridge AS "alias" ),
          e.name
        )
      ), '')::xml
    )
  )

然后将所有行(即<object ...>的每个值)连接成一行格式良好的XML代码。然后可以使用xmlconcat函数连接该行。

此解决方案的缺点是每个项目都必须具有带有硬编码名称的重复查询。当只有少数元素时,这是可以接受的。另一个缺点是,如果添加了其他元素类型(例如tablewareglasswaredinnerware)或重命名(例如,utensilscutlery),然后必须修改源代码。