Как обрабатывать нулевые объекты в XML, поступающем из SQL Server? - PullRequest
1 голос
/ 06 февраля 2009

У меня есть хранимая процедура, которая возвращает объект в виде XML. Как мне справиться со случаем, когда объект не существует?

Я не могу вернуть пустую или пустую строку, поскольку XmlReader жалуется, что это недопустимый XML.

Если я верну пустой тег, как мне узнать, является ли он пустым объектом или нет?

Ответы [ 5 ]

1 голос
/ 06 февраля 2009

Два способа, которые я видел:

  1. Включите атрибут, чтобы указать, является ли элемент нулевым или нет (isnull = "true | false"). Как правило, ложь предполагается, если атрибут не включен.
  2. Не включайте элемент для этого узла. Если он не существует в xml, он нулевой. Если он существует и является пустым, это просто пустая строка. Это, конечно, зависит от того, что ваш код синтаксического анализа может определить, какие элементы должны существовать (как правило, с помощью схемы или информации ранее в файле xml).

С первым вариантом, как правило, проще разобраться, но в результате получается больше текста. Второй может привести к уменьшению XML-файла.

1 голос
/ 06 февраля 2009

Ну, общий подход - это некоторый атрибут маркера, например xsi:nil="true" (хотя это только пример).

0 голосов
/ 06 февраля 2009

В зависимости от ваших «внешних ограничений» (например, сколько процесса генерации / потребления XML вы контролируете), вы можете выразить ноль, вообще не включая элемент.

Принимающая сторона (проверка схемы и т. Д.), Конечно, должна быть готова к работе с необязательным элементом.

0 голосов
/ 06 февраля 2009

Создайте выходной параметр для вашей хранимой процедуры. Внутри хранимой процедуры установите значение 1 для существующего объекта или 0 для несуществующего. Десериализовать результат xml хранимой процедуры только в том случае, если параметр out равен 1.

CREATE PROCEDURE sp_GetObjectAsXml         
(
    @intId  int,
    @intExists int out
) 
AS  
BEGIN
    SELECT 'hello world'  WHERE 1 = @intId
    SET @intExists = @@ROWCOUNT
END

-- Happy Path
DECLARE @intExists int
exec sp_GetObjectAsXml 1, @intExists out
SELECT @intExists -- results in 1

-- Sad Path
DECLARE @intExists int
exec sp_GetObjectAsXml 10, @intExists out
SELECT @intExists -- results in 0
0 голосов
/ 06 февраля 2009

Либо верните самостоятельно определенный пустой тег () и проверьте его, либо просто измените способ чтения данных:

  • извлеките поток сначала в строковую переменную и проверьте наличие String.IsNullOrEmpty
  • просто попробуйте перехватить читателя для ArgumentNullException / ArgumentException
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...