从行创建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
函数连接行

此解决方案的一个缺点是,每个项都必须有一个具有硬编码名称的重复查询。当只有几个元素时,这在某种程度上是可以接受的。另一个缺点是,如果添加了额外的元素类型(例如,
餐具
玻璃器皿
,或
餐具
)或重命名(例如,
餐具
餐具
),则必须修改源代码