Создать элементы XML из строк - PullRequest
1 голос
/ 28 декабря 2011

Фон

Таблица (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 Ответ

1 голос
/ 28 декабря 2011

Поскольку 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), то исходный код необходимо будет изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...