我是XMl的新手,我的任务是从XML列中提取一些值。
我已经阅读了很多关于如何在互联网上和此处进行此操作的示例,并尝试了几种不同的方法。虽然我可以让它们工作,但它们只返回空值,所以显然有些事情是不对的。我能看到的唯一区别是,在我们的XML代码中,他们使用SOAP。以前的开发人员编写了代码,所以我不能问他们。
这些是我尝试过的方法:
SELECT
settings.value('item[1]/_value[1]', 'int') as PrinterId
FROM dbo.usersettings
where userid = 2156
----------------------------------------------------------------------------------
create table XMLPrinters (PrinterList xml)
insert XMLPrinters select settings
from dbo.UserSettings
where userid = 2156
select
r.p.value ('item[1]/_key[1]', 'nvarchar (50)') as PrinterType,
r.p.value ('item[1]/_value[1]', 'int') as PrinterId
from XMLPrinters
cross apply printerlist.nodes ('//item') r(p)
正如我所说的,我对XML非常陌生并且不是来自编码背景,所以可能有一些我缺少的东西,但XML代码似乎不适合我在网上看到的其他格式,我想这可能是由于SOAP。
代码本身长度为2496行,但这是从一开始的提取,我试图从中提取值:
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<SOAP-ENC:Array SOAP-ENC:arrayType="xsd:anyType[5]">
<item xmlns:a2="http://schemas.microsoft.com/clr/ns/System.Collections" xsi:type="a2:DictionaryEntry">
<_key xsi:type="xsd:string">primaryprinter</_key>
<_value xsi:type="xsd:anyType" xsi:null="1" />
</item>
<item xmlns:a2="http://schemas.microsoft.com/clr/ns/System.Collections" xsi:type="a2:DictionaryEntry">
<_key xsi:type="xsd:string">secondaryprinter</_key>
<_value xsi:type="xsd:anyType" xsi:null="1" />
</item>
<item xmlns:a2="http://schemas.microsoft.com/clr/ns/System.Collections" si:type="a2:DictionaryEntry">
<_key xsi:type="xsd:string">i18mminstancelabel</_key>
<_value xsi:type="xsd:string">1056</_value>
</item>
最后我需要做的是提取_value,其中_key = PrimaryPrinter并为每个用户执行此操作。
任何人的帮助或想法都会受到极大的欢迎!
此致
朱莉
答案 0 :(得分:0)
实际上并不了解您的第一个查询的作用。但是,如果从获取值的xpath中删除item[1]/
,则第二个将起作用。
select
r.p.value ('_key[1]', 'nvarchar (50)') as PrinterType,
r.p.value ('_value[1]', 'int') as PrinterId
from XMLPrinters
cross apply printerlist.nodes ('//item') r(p)
使用您提供的XML的结果:
PrinterType PrinterId
-------------------------------------------------- -----------
primaryprinter 0
secondaryprinter 0
i18mminstancelabel 1056