【问题标题】:T-SQL XML get a value from a node problem?T-SQL XML 从节点问题中获取值?
【发布时间】:2011-08-05 20:26:37
【问题描述】:

我有一个类似的 XML:

<?xml version="1.0" encoding="utf-16"?>
<ExportProjectDetailsMessage xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Project">
<CPProjectId>7665699f-6772-424c-8b7b-405b9220a8e7</CPProjectId>
</ExportProjectDetailsMessage>

我正在尝试使用以下方法将 CPProjectId 作为唯一标识符:

DECLARE @myDoc xml
DECLARE @ProdID varchar(max)

SET @myDoc = '<ExportProjectDetailsMessage xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Project"><CPProjectId>7665699f-6772-424c-8b7b-405b9220a8e7</CPProjectId></ExportProjectDetailsMessage>'

SET @ProdID =  @myDoc.value('(ExportProjectDetailsMessage/CPProjectId)[1]', 'varchar(max)' )
SELECT @ProdID

我只能收到 NULL =/ 我在 @myDoc.value 上尝试了很多组合,但没有结果 =/

如何从我的 XML 中检索值?

谢谢!

--编辑: 我注意到,当我从 XML 中删除命名空间声明时,它工作正常! 问题是我需要这个命名空间! =/

【问题讨论】:

标签: sql sql-server xml tsql


【解决方案1】:

你说得对,命名空间就是问题所在。您正在查询正在寻找一个节点 ExportProjectDetailsMessage 但这样的节点在您的文档中不存在,因为在您的文档中有一个命名空间声明为默认值。既然你不能删除它(你也不应该),你应该像这样将它包含在你的 XPATH 查询中:

set @ProdId = @myDoc.value('
    declare namespace PD="http://schemas.datacontract.org/2004/07/Project";           
(PD:ExportProjectDetailsMessage/PD:CPProjectId)[1]', 'varchar(max)' )

您可能还想考虑不使用 varchar(max) 而可能是 uniqueidentifier

【讨论】:

  • 伙计.. 非常感谢! ;) PS:我使用 varchar 只是为了测试其他字段 =]
【解决方案2】:

更好的方法是在每个查询之前简单地声明命名空间:

;WITH XMLNAMESPACES(DEFAULT 'http://schemas.datacontract.org/2004/07/Project')

这就像一个临时默认值。当您在批处理中运行下一个查询时,如果您没有在每次选择之前指定它,您将再次获得空值。

因此,您可以使用“SELECT”来设置值,而不是使用“SET”:

;WITH XMLNAMESPACES(DEFAULT 'http://schemas.datacontract.org/2004/07/Project')
SELECT @ProdID =  @myDoc.value('(ExportProjectDetailsMessage/CPProjectId)[1]', 'VarChar(MAX)')
SELECT @ProdID

相同的结果,只是更具可读性和可维护性。 我在这里找到了解决方案:http://www.sqlservercentral.com/Forums/Topic967100-145-1.aspx#bm967325

【讨论】:

  • 我看到第一个答案在此响应之前已被接受。但就其价值而言,我发现这是一种更好的技术(假设您可以依赖命名空间是一致的)。
猜你喜欢
  • 2018-08-24
  • 2013-07-29
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2018-02-10
相关资源
最近更新 更多