具有不同名称的节点的 TSQL XPath
TSQL XPath for nodes with different names
在 SQL Server 2008 中(是的,我知道)您如何编写 XPath 来查找具有不同名称的节点?[=14=]
例如,如果我有以下任一项 XML...
DECLARE @XML XML = '<data><id>1</id><id>2</id></data>'
or...
DECLARE @XML XML = '<d><i>1</i><i>2</i></d>'
我可以编写以下内容,它适用于第一个 XML,但不适用于第二个 XML。
SELECT X.value('.','int') FROM @XML.nodes('/data/id') AS X(X)
我打算使用联合 (/data/id | /d/i)
但 SQL 服务器显然不支持联合。
简单的解决方案是执行以下操作...
SELECT X.value('.','int') FROM @XML.nodes('/data/id') AS X(X)
UNION
SELECT X.value('.','int') FROM @XML.nodes('/d/i') AS X(X)
...但如果只有一个 XPath 解决方案,我会更喜欢它
我刚刚找到了 this answer(它适用于一般的 XPath,而不是基于 SQL)并且它给了我解决方案。
使用 ,
字符并括在括号中...
SELECT X.value('text()[1]','int') FROM @XML.nodes('(/data/id,/d/i)') AS X(X)
(注意,我还根据@YitzhakKhabinsky 的建议将 '.'
更新为 'text()[1]'
)
在 SQL Server 2008 中(是的,我知道)您如何编写 XPath 来查找具有不同名称的节点?[=14=]
例如,如果我有以下任一项 XML...
DECLARE @XML XML = '<data><id>1</id><id>2</id></data>'
or...
DECLARE @XML XML = '<d><i>1</i><i>2</i></d>'
我可以编写以下内容,它适用于第一个 XML,但不适用于第二个 XML。
SELECT X.value('.','int') FROM @XML.nodes('/data/id') AS X(X)
我打算使用联合 (/data/id | /d/i)
但 SQL 服务器显然不支持联合。
简单的解决方案是执行以下操作...
SELECT X.value('.','int') FROM @XML.nodes('/data/id') AS X(X)
UNION
SELECT X.value('.','int') FROM @XML.nodes('/d/i') AS X(X)
...但如果只有一个 XPath 解决方案,我会更喜欢它
我刚刚找到了 this answer(它适用于一般的 XPath,而不是基于 SQL)并且它给了我解决方案。
使用 ,
字符并括在括号中...
SELECT X.value('text()[1]','int') FROM @XML.nodes('(/data/id,/d/i)') AS X(X)
(注意,我还根据@YitzhakKhabinsky 的建议将 '.'
更新为 'text()[1]'
)