Я пытаюсь найти способ синтаксического анализа довольно большого XML-файла в таблицу, которая просто показывает имя узла и его значение. В XML нет никаких атрибутов, но есть несколько вложенных узлов.Анализ XML в таблице в SQL (только узлы с значениями)
Поскольку там XML генерируется динамически, нет возможности узнать точную глубину этого гнездования. Но можно с уверенностью предположить, что только LAST CHILD NODE любой ветки будет содержать данные.
Это моя попытка решения, но проблема в том, что при доступе к родительскому узлу данные из каждого дочернего объекта объединяются в качестве значения.
DECLARE @ProjectXML XML
SET @ProjectXML = '
<Project>
<ProjectId>1</ProjectId>
<OrganizationId>1</OrganizationId>
<Title>This is a Test Title</Title>
<Description>This is a Test Description</Description>
<ProjectType>
<Id>1</Id>
<Name>Test Name</Name>
<Outer>
<Inner1>Hi</Inner1>
<Inner2>There</Inner2>
</Outer>
</ProjectType>
</Project>
'
SELECT
n.value('local-name(.)','VARCHAR(100)') AS Name,
n.value('.','VARCHAR(MAX)') AS Value
FROM @ProjectXML.nodes('//*') AS ProjectXML(n)
Какие результаты в:
Project 11This is a Test TitleThis is a Test Description1Test NameHiThere
ProjectId 1
OrganizationId 1
Title This is a Test Title
Description This is a Test Description
ProjectType 1Test NameHiThere
Id 1
Name Test Name
Outer HiThere
Inner1 Hi
Inner2 There
Есть ли способ (с помощью XQuery возможно?) Игнорировать родительские узлы, которые не содержат никаких данных, и возвращать только значения для дочерних узлов, которые делают?
** Бонусные баллы, если можно вернуть имя каждого результата в виде форматированного списка из его родительских узлов, таких как:
Project - ProjectId 1
Project - OrganizationId 1
Project - Title This is a Test Title
Project - Description This is a Test Description
Project - Project Type - Id 1
Project - Project Type - Name Test Name
Project - Project Type - Outer - Inner1 Hi
Project - Project Type - Outer - Inner2 There
Вы только что спасли меня как минимум на 3 дня, вытаскивая мои волосы. Это отлично работало, колонки «FullPath» и «Value» были именно тем, что мне нужно. Я провел это против моих больших XML-файлов, и все прошло гладко. Я не могу вас поблагодарить! –
@ JustinTrenary Я был доволен, когда я наткнулся на него. Мне стыдно признаться, как выглядела моя попытка. Я сделал некоторые драматические трюки в моем случае, но не хотел брать кредит за его работу. Кстати, я дал вам Plus1, потому что это был хороший и хорошо сформированный вопрос. Я был бы в восторге, если бы все новые члены были на половину своей работы. –
Мне было бы любопытно, что ваши попытки * ашаминга выглядели так :-) Я просто отправил ответ с довольно простой 'XQuery' ... В любом случае +1 за вашу честность :-) – Shnugo