У меня есть куча XML-сообщений в таблице PostgreSQL 9.1.3 со столбцом content
типа XML). Они не все же «типа», так что я пытаюсь извлечь корневой тип, используя запрос, как это:Выберите имя корневого элемента с XPath в PostgreSQL
SELECT xpath('name(/*)', content) FROM message;
в соответствии с рекомендациями this answer на аналогичный вопрос SO.
сообщение образец:
<?xml version="1.0" encoding="UTF-8"?>
<WML version="6" xmlns="http://example.com/schemas/WML">...</WML>
Для случая, который я надеюсь получить результат {WML} '. К сожалению, он просто возвращает пустой массив. Добавление параметра namespaces в xpath
или удаление пространства имен из сообщения не помогает.
Обсуждение в списках рассылки PostgreSQL, по-видимому, explain it as a bug в обработке XPath в PostgreSQL. Однако это было в 2008 году, и взгляд на источник PostgreSQL показывает, что часть кода was changed в 2009 году. Я не разработчик PostgreSQL, поэтому я не уверен, что ошибка является или не является фактором в моем случае.
Но мне интересно, есть ли обходной путь, например, альтернативное выражение XPath, которое может работать? Я бы предпочел не прибегать к регулярным выражениям для синтаксического анализа XML, хотя, если вы можете предложить короткий, прочный, надежный RE, это было бы лучше, чем ничего.