这里唯一可能很复杂的是命名空间。这个XML是如何生成的?看到相同的命名空间是很不寻常的( http://www.w3.org/2001/XMLSchema-instance )默认情况下,有两个不同的别名......
http://www.w3.org/2001/XMLSchema-instance
DECLARE @mockup TABLE(ID INT IDENTITY, YourXML VARCHAR(MAX)); INSERT INTO @mockup VALUES ('<manifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p3="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.w3.org/2001/XMLSchema-instance" p3:manifestDateTime="2016-02-17T17:34:29.5925096Z" p3:manifestVersion="1.1" p3:manifestId="Some_Data"> <!--Some more stuff--> </manifest>');
- 这种方法根本不考虑名称空间。我使用通配符 *:
*:
SELECT CAST(YourXML AS XML).value(N'(/*:manifest/@*:manifestId)[1]',N'nvarchar(max)') FROM @mockup;
- 这种方法提前声明所有需要的命名空间(在大多数情况下最好的方法):
WITH XMLNAMESPACES(DEFAULT 'http://www.w3.org/2001/XMLSchema-instance' ,'http://www.w3.org/2001/XMLSchema-instance' AS p3) SELECT CAST(YourXML AS XML).value(N'(/manifest/@p3:manifestId)[1]',N'nvarchar(max)') FROM @mockup;
- 如果你真的不需要多个值,这种方法很有用。我用了一个别名 ns1 对于此命名空间的所有不同出现:
ns1
SELECT CAST(YourXML AS XML).value(N'declare namespace ns1="http://www.w3.org/2001/XMLSchema-instance"; (/ns1:manifest/@ns1:manifestId)[1]',N'nvarchar(max)') FROM @mockup;