我在sql中有以下xml列:
NSString *videoPath = [documentsDirectory stringByAppendingString:finalPath];
尝试读取性别为男性的xml中的所有值。试过这个
Create table dbo.sampleXML( ID int identity(1,1) primary key,
Name char(10) not null,
content xml null)
go
insert into dbo.sampleXML (Name,content) values ('ss',CAST('<Employee>
<FirstName> ss </FirstName>
<LastName> nn </LastName>
<Gender> Male </Gender>
<Age>31</Age>
</Employee>
' as xml))
insert into dbo.sampleXML (Name,content) values ('xx',CAST('<Employee>
<FirstName> xx </FirstName>
<LastName> yy </LastName>
<Gender> Male </Gender>
<Age>3</Age>
</Employee>
insert into dbo.sampleXML (Name,content) values ('dd',CAST('<Employee>
<FirstName> ss </FirstName>
<LastName> dd </LastName>
<Gender> Female </Gender>
<Age>30</Age>
</Employee>
但是面对错误&#34;选择content.query(&#39; / Employee / FirstName&#39;)作为FirstName,content.query(&#39; / Employee / Gender [1]&#39; )来自dbo.sampleXML的性别,其中content.value(&#39; /员工/性别&#39;,&#39; varchar(10)&#39;)=&#39;男性&#39;&#34;
答案 0 :(得分:3)
1)当你使用.value
时,需要在xpath表达式的每个级别指定序号。2)您在Gender文字中有额外的空格,因此您需要将它们包含在where子句中,即&#39;男&#39;
select content.query ('/Employee/FirstName') as FirstName,content.query('/Employee/Gender[1]') as Gender
from dbo.sampleXML
where content.value ('/Employee[1]/Gender[1]','varchar(10)')=' Male '
答案 1 :(得分:2)
根据您提出的问题,您希望过滤您的XML以仅显示男性人员。您可以使用.nodes()
中的过滤谓词来实现此目的。
注意:比较字符串为&#34;(空格)男性(空格)&#34;因为你的数据是这样的。
Create table dbo.sampleXML( ID int identity(1,1) primary key,
Name char(10) not null,
content xml null)
go
insert into dbo.sampleXML (Name,content) values ('ss',CAST('<Employee>
<FirstName> ss </FirstName>
<LastName> nn </LastName>
<Gender> Male </Gender>
<Age>31</Age>
</Employee>' as xml));
insert into dbo.sampleXML (Name,content) values ('xx',CAST('<Employee>
<FirstName> xx </FirstName>
<LastName> yy </LastName>
<Gender> Male </Gender>
<Age>3</Age>
</Employee>' as xml));
insert into dbo.sampleXML (Name,content) values ('dd',CAST('<Employee>
<FirstName> ss </FirstName>
<LastName> dd </LastName>
<Gender> Female </Gender>
<Age>30</Age>
</Employee>' as xml));
SELECT ID
,Filtered.Males.value('Gender[1]','varchar(max)') AS Gender
,Filtered.Males.value('FirstName[1]','varchar(max)') AS FirstName
,Filtered.Males.value('LastName[1]','varchar(max)') AS LastName
,Filtered.Males.value('Age[1]','int') AS Age
FROM dbo.sampleXML
CROSS APPLY content.nodes('/Employee[Gender=" Male "]') AS Filtered(Males);
结果
ID Gender FirstName LastName Age
1 Male ss nn 31
2 Male xx yy 3
答案 2 :(得分:1)
正如您应该看到的错误消息所示,value()
XML方法需要一个保证返回单例值或为空的XPath / XQuery。 /Employee/Gender[1]
会在Gender
中返回第一个Employee
子项,但不能保证XML中只有一个Employee
。
那就是说,你需要在Employee
和Gender
之后放置索引来保证单例或空返回值,或者用括号包装整个XPath并返回第一个像这样的匹配:
(/Employee/Gender)[1]
此外,示例XML中的Gender
元素值具有空格,因此'Male'
过滤器无法匹配。您可能希望使用LTRIM(RTRIM())
删除周围空格,因为XPath normalize-space()
在SQL Server XPath / XQuery中不可用。