Это правильный XML и как его реплицировать с SQL Server?

Мне действительно нужно реплицировать XML-файл с SQL Server, и теперь я спотыкаюсь о следующей структуре внутри XML-файла, и я не знаю, как это повторить.

На данный момент структура выглядит следующим образом:

        <ART_TAG1>
            <UNMLIMITED/>
        </ART_TAG1>
        <ART_TAG2>
            <ART_TAG3>
                <Data_Entry/>
            </ART_TAG3>
        </ART_TAG2>

Мне интересно, если это правильный XML, что данные внутри (без ограничений и Data_Entry) заключены в закрывающий тег XML. Валидатор XML https://www.w3schools.com/xml/xml_validator.asp говорит мне, что это правильно. Но сейчас я пытаюсь воспроизвести это с помощью Transact-SQL.

Если я попытаюсь повторить это, я смогу создать только следующий скрипт TSQL, который, очевидно, не полностью выглядит как оригинал.

  SELECT 'UNLIMITED' as 'ART_TAG1'
    , 'Data_Entry' as 'ART_TAG2/ART_TAG3'
    FOR XML PATH(''), ROOT('root')

  <root>
  <ART_TAG1>UNLIMITED</ART_TAG1>
  <ART_TAG2>
  <ART_TAG3>Data_Entry</ART_TAG3>
  </ART_TAG2>
  </root>

Всего 1 ответ


Если я правильно понял, ваш вопрос:

Как я могу поставить свой запрос для создания этих <SomeElement /> ?

Посмотри на это:

- Это создаст заполненные узлы

SELECT 'outer' AS [OuterNode/@attr]
      ,'inner' AS [OuterNode/InnerNode]
FOR XML PATH('row');

- Пустая строка - это какой-то контент

SELECT 'outer' AS [OuterNode/@attr]
      ,'' AS [OuterNode/InnerNode]
FOR XML PATH('row');

- пропущенное значение ( NULL ) по умолчанию опущено

SELECT 'outer' AS [OuterNode/@attr]
      ,NULL AS [OuterNode/InnerNode]
FOR XML PATH('row');

- Теперь проверьте, что здесь происходит:
--First XML имеет пустой элемент, а второй использует самозакрывающийся элемент

DECLARE @xml1 XML=
N'<row>
  <OuterNode attr="outer">
    <InnerNode></InnerNode>
  </OuterNode>
</row>'

DECLARE @xml2 XML=
N'<row>
  <OuterNode attr="outer">
    <InnerNode/>
  </OuterNode>
</row>'

SELECT @xml1,@xml2;

Результат одинаков для обоих ...

Немного предыстории: Семантически пустой элемент <element></element> точно такой же, как и самозакрывающийся элемент <element /> . Это не должно иметь никакого значения, используете ли вы один или другой. Если ваш потребитель не может справиться с этим, это проблема чтения.

Да, вы можете форсировать любой контент в XML на строковом уровне, но - как показывает пример выше - это просто (опасный) взлом.

XML в T-SQL по умолчанию возвращает отсутствующий узел как NULL а пустой элемент - как пустой (в зависимости от типа данных и учитывает разницу между элементом и его узлом text() ).

Короче говоря: об этом не стоит думать ...


Есть идеи?

10000