表格(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元素?
谢谢!
答案 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
函数连接该行。
此解决方案的缺点是每个项目都必须具有带有硬编码名称的重复查询。当只有少数元素时,这是可以接受的。另一个缺点是,如果添加了其他元素类型(例如tableware
,glassware
或dinnerware
)或重命名(例如,utensils
到cutlery
),然后必须修改源代码。