从行创建XML元素 背景
表(从行创建XML元素 背景,xml,postgresql,Xml,Postgresql,表(设备组[eg])包括各种设备类别: bakeware cookware kitchenware utensils 问题 值必须是编码的XML元素,例如: xmlelement( name eg.label ) 每个元素可以有多个对象,如以下XML片段所示: <equipment> <bakeware> <object min-quantity="20">ramekin</object> <object alias=
设备组
[eg])包括各种设备类别:
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>
这是格式良好的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行:选择xmlconcat(“”,“”,“”);
^
详细信息:实体:第1行:解析器错误:标记a第1行中的数据过早结束
问题:
如何创建使用表格数据填充名称的XML元素
谢谢大家! 由于
xmlconcat
只接受格式良好的XML作为参数,因此一个选项是创建所需元素的子查询,如下所示:
xmlelement( name "bakeware",
xmlconcat(
array_to_string( array_agg(
xmlelement( name "object",
xmlattributes( e.abridge AS "alias" ),
e.name
)
), '')::xml
)
)
然后将所有行(即
的每个值)连接到一行格式良好的XML代码中。然后可以使用xmlcontat
函数连接行
此解决方案的一个缺点是,每个项都必须有一个具有硬编码名称的重复查询。当只有几个元素时,这在某种程度上是可以接受的。另一个缺点是,如果添加了额外的元素类型(例如,
餐具
,玻璃器皿
,或餐具
)或重命名(例如,餐具
到餐具
),则必须修改源代码。因为xmlcontat
只接受格式良好的XML作为参数,一个选项是创建所需元素的子查询,如下所示:
xmlelement( name "bakeware",
xmlconcat(
array_to_string( array_agg(
xmlelement( name "object",
xmlattributes( e.abridge AS "alias" ),
e.name
)
), '')::xml
)
)
然后将所有行(即
的每个值)连接到一行格式良好的XML代码中。然后可以使用xmlcontat
函数连接行
此解决方案的一个缺点是,每个项都必须有一个具有硬编码名称的重复查询。当只有几个元素时,这在某种程度上是可以接受的。另一个缺点是,如果添加了额外的元素类型(例如,餐具
,玻璃器皿
,或餐具
)或重命名(例如,餐具
到餐具
),则必须修改源代码