如何处理来自SQL Server的XML中的空对象?

时间:2009-02-06 12:49:27

标签: c# sql-server xml

我有一个以XML格式返回对象的存储过程。如何处理对象不存在的情况?

我不能返回null或空字符串,因为XmlReader抱怨它不是有效的XML。

如果我返回一个空标签,我怎么知道它只是一个空对象还是没有对象?

5 个答案:

答案 0 :(得分:1)

嗯,常见的方法是某些标记属性,例如xsi:nil="true"(虽然这只是一个例子)。

答案 1 :(得分:1)

我见过的两种方式是:

  1. 包含一个属性以指示该项是否为null(isnull =“true | false”)。通常,如果未包含该属性,则假定为false。
  2. 不要包含该节点的元素。如果它在xml中不存在则为null。如果它确实存在且为空,则它只是一个空字符串。当然,这依赖于您的解析代码能够确定应该存在哪些元素(通常通过xml文件中的模式或信息)。
  3. 第一个选项通常更容易处理,但会产生更多文字。第二个可能会导致更小的xml文件。

答案 2 :(得分:0)

返回自定义的空标记()并检查它或只是改变读取数据的方式:

  • 首先将流提取到字符串-var中并检查String.IsNullOrEmpty
  • 只需尝试抓住读者ArgumentNullException / ArgumentException

答案 3 :(得分:0)

为存储过程创建一个out参数。在存储过程内部,将现有对象的值设置为1,或者将不存在的值设置为0。如果out参数为1,则仅反序列化存储过程的xml结果。

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

答案 4 :(得分:0)

根据您的“外部约束”(例如,您控制的XML生成/消费过程的多少),您可以通过不包括元素来表示null。

接收方(模式验证等)当然必须准备好处理可选元素。