SOAP XML 解析器 0 行/NULL
SOAP XML parser 0 rows/ NULL
我正在尝试从以下 xml 中解析 Message
。尽管有许多类似的答案,但似乎没有任何效果。
declare @x xml
select @x=N'<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<SubmitDocumentsResponse xmlns="http://somesite/webservices/">
<SubmitDocumentsResult>
<Code>000</Code>
<Message>Success.</Message>
<ItemsCreated>
<ServiceItemCreated>
<Id>2816</Id>
<Protocol>ΑΚ - ΠΠ6</Protocol>
<SubmitDate>28/03/2022 16:05</SubmitDate>
</ServiceItemCreated>
</ItemsCreated>
</SubmitDocumentsResult>
</SubmitDocumentsResponse>
</soap:Body>
</soap:Envelope>';
select @x
select r.value('Message[1]','nvarchar(max)') as [Parsed Result]
from @x.nodes('/*:Envelope/*:Body/*:SubmitDocumentsResponse/*:SubmitDocumentsResult') as t(r)
此 returns 一行具有 NULL 值。
我尝试过的其他事情:
r.value('Message[1]','nvarchar(max)') -- same error
r.value('(Message)[1]','nvarchar(max)') -- same error
r.value('(@Message)[1]','nvarchar(max)') -- same error
r.value('Message','nvarchar(max)') -- error,requires a singleton
@x.nodes('/*:Envelope/*:Body/SubmitDocumentsResponse/SubmitDocumentsResult') -- yields 0 rows
@x.nodes('//SubmitDocumentsResult') -- yields 0 rows
这也产生 0 行:
;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS soap)
select r.value('Message[1]','nvarchar(max)') as [Parsed Result]
from @x.nodes('/soap:Envelope/soap:Body/*SubmitDocumentsResponse/*:SubmitDocumentsResult') as t(r)
如何解析属性?我错过了什么?
WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS soap,
'http://somesite/webservices/' as ns2)
select
r.value('ns2:Code[1]','char(3)') as [Code],
r.value('ns2:Message[1]','nvarchar(20)') as [Parsed Result],
r.value('ns2:ItemsCreated[1]/ns2:ServiceItemCreated[1]/ns2:Id[1]','int') as Id
from @x.nodes('/soap:Envelope/soap:Body/ns2:SubmitDocumentsResponse/ns2:SubmitDocumentsResult') as t(r)
输出:
Code
Parsed Result
Id
000
Success.
2816
文档:
您没有使用命名空间,您需要将它们添加到 XQuery 中。最简单的方法是使用 XMLNAMESPACES
块。使用 *
非常慢。
您甚至可以将命名空间之一设置为默认命名空间:
WITH XMLNAMESPACES (
'http://schemas.xmlsoap.org/soap/envelope/' AS soap,
DEFAULT 'http://somesite/webservices/'
)
select
r.value('(Code/text())[1]','char(3)') as [Code],
r.value('(Message/text())[1]','nvarchar(20)') as [Parsed Result],
r.value('(ItemsCreated/ServiceItemCreated/Id/text())[1]','int') as Id
from @x.nodes('/soap:Envelope/soap:Body/SubmitDocumentsResponse/SubmitDocumentsResult') as t(r)
请注意,使用text()
获取节点的内部文本稍微快一些。
我正在尝试从以下 xml 中解析 Message
。尽管有许多类似的答案,但似乎没有任何效果。
declare @x xml
select @x=N'<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<SubmitDocumentsResponse xmlns="http://somesite/webservices/">
<SubmitDocumentsResult>
<Code>000</Code>
<Message>Success.</Message>
<ItemsCreated>
<ServiceItemCreated>
<Id>2816</Id>
<Protocol>ΑΚ - ΠΠ6</Protocol>
<SubmitDate>28/03/2022 16:05</SubmitDate>
</ServiceItemCreated>
</ItemsCreated>
</SubmitDocumentsResult>
</SubmitDocumentsResponse>
</soap:Body>
</soap:Envelope>';
select @x
select r.value('Message[1]','nvarchar(max)') as [Parsed Result]
from @x.nodes('/*:Envelope/*:Body/*:SubmitDocumentsResponse/*:SubmitDocumentsResult') as t(r)
此 returns 一行具有 NULL 值。 我尝试过的其他事情:
r.value('Message[1]','nvarchar(max)') -- same error
r.value('(Message)[1]','nvarchar(max)') -- same error
r.value('(@Message)[1]','nvarchar(max)') -- same error
r.value('Message','nvarchar(max)') -- error,requires a singleton
@x.nodes('/*:Envelope/*:Body/SubmitDocumentsResponse/SubmitDocumentsResult') -- yields 0 rows
@x.nodes('//SubmitDocumentsResult') -- yields 0 rows
这也产生 0 行:
;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS soap)
select r.value('Message[1]','nvarchar(max)') as [Parsed Result]
from @x.nodes('/soap:Envelope/soap:Body/*SubmitDocumentsResponse/*:SubmitDocumentsResult') as t(r)
如何解析属性?我错过了什么?
WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS soap,
'http://somesite/webservices/' as ns2)
select
r.value('ns2:Code[1]','char(3)') as [Code],
r.value('ns2:Message[1]','nvarchar(20)') as [Parsed Result],
r.value('ns2:ItemsCreated[1]/ns2:ServiceItemCreated[1]/ns2:Id[1]','int') as Id
from @x.nodes('/soap:Envelope/soap:Body/ns2:SubmitDocumentsResponse/ns2:SubmitDocumentsResult') as t(r)
输出:
Code | Parsed Result | Id |
---|---|---|
000 | Success. | 2816 |
文档:
您没有使用命名空间,您需要将它们添加到 XQuery 中。最简单的方法是使用 XMLNAMESPACES
块。使用 *
非常慢。
您甚至可以将命名空间之一设置为默认命名空间:
WITH XMLNAMESPACES (
'http://schemas.xmlsoap.org/soap/envelope/' AS soap,
DEFAULT 'http://somesite/webservices/'
)
select
r.value('(Code/text())[1]','char(3)') as [Code],
r.value('(Message/text())[1]','nvarchar(20)') as [Parsed Result],
r.value('(ItemsCreated/ServiceItemCreated/Id/text())[1]','int') as Id
from @x.nodes('/soap:Envelope/soap:Body/SubmitDocumentsResponse/SubmitDocumentsResult') as t(r)
请注意,使用text()
获取节点的内部文本稍微快一些。