Проверьте, являются ли узлы XML пустыми в SQL - PullRequest
0 голосов
/ 26 апреля 2018

Привет, я новичок в манипулировании XML, мой вопрос будет, если есть возможность определить, является ли узел XML пустым узлом, как это: <gen:nodeName />

Я могу манипулировать отдельными узлами, однако мне было бы интересно, есть ли такой подход, как цикл или рекурсивная функция, который мог бы сэкономить некоторое время при ручной работе, просматривая каждый отдельный узел. Я понятия не имею, как подойти к этой проблеме, хотя.

Спасибо за помощь.

1 Ответ

0 голосов
/ 26 апреля 2018

Вы не указали диалект SQL ([sql] недостаточно, всегда указывайте СУБД, включая версию).

Это для SQL-сервера, но семантика должна быть одинаковой.

DECLARE @xml XML=
N'<root>
    <SelfClosing />
    <NoContent></NoContent>
    <BlankContent> </BlankContent>
    <HasContent>blah</HasContent>
    <HasContent>other</HasContent>
</root>';

SELECT @xml.query(N'/root/*') AS AnyBelowRoor                  --All elements
      ,@xml.query(N'/root/*[text()]') AS AnyWithTextNode       --blah and other
      ,@xml.query(N'/root/*[not(text())]') AS NoText           --no text
      ,@xml.query(N'/root/*[text()="blah"]') AS AnyWithTextNode--blah only

<SelfClosing /> семантически совпадает с <NoContent><NoContent>. Нет никакой разницы.

Это может быть сюрпризом, но blank, поскольку контент тоже считается пустым.

Таким образом, проверка на пусто или не пусто - это проверка на существование узла text(). можно отрицать это с помощью not(), чтобы найти все без text().

Интересно: результат для NoText возвращается так (SQL-Server)

<SelfClosing />
<NoContent />
<BlankContent />

Три элемента неявно возвращаются в кратчайшем формате.

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