2012-04-23 3 views
2

У меня есть куча 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, это было бы лучше, чем ничего.

ответ

0

Я не знаю обходного пути для более старых версий, но это исправлено в PostgreSQL 9.2, так что это здорово.

(Наиболее вероятным решением было бы написать функцию для синтаксического анализа XML вручную, но я рад, что мне не нужно прибегать к этому сейчас!)

0

Очевидно, это еще не решено было по состоянию на июнь 2011 года.
Я нашел this thread on pgsql-hackers, который точно описывает вашу проблему.

Смежные вопросы