#xml #sql-server-2008 #xpath
#xml #sql-server-2008 #xpath
Вопрос:
У меня есть столбец, в котором хранятся XML
данные. Внутри этих данных мне нужно сообщать об одном поле, когда другое field = xxxx
.
Вот мой XML:
<?xml version="1.0" encoding="utf-16"?>
<SourceIdentifierPairs xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas">
<SourceIdentifierPair>
<Source>ABCPN</Source>
<Identifier>123456789</Identifier>
</SourceIdentifierPair>
<SourceIdentifierPair>
<Source>ABCMR</Source>
<Identifier>000000123654</Identifier>
</SourceIdentifierPair>
<SourceIdentifierPair>
<Source>PRIM</Source>
<Identifier>00112233</Identifier>
</SourceIdentifierPair>
</SourceIdentifierPairs>
Когда источник ABCPN
мне нужно вытащить Identifier
.
Ответ №1:
Искомое выражение XPath
//SourceIdentifierPair[Source='ABCPN']/Identifier
Обязательно зарегистрируйте пространство имен по умолчанию.
Пример кода:
declare @x xml = '<SourceIdentifierPairs xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas">
<SourceIdentifierPair>
<Source>ABCPN</Source>
<Identifier>123456789</Identifier>
</SourceIdentifierPair>
<SourceIdentifierPair>
<Source>ABCMR</Source>
<Identifier>000000123654</Identifier>
</SourceIdentifierPair>
<SourceIdentifierPair>
<Source>PRIM</Source>
<Identifier>00112233</Identifier>
</SourceIdentifierPair>
</SourceIdentifierPairs>'
--xpath as above, with default namespace specified
;with xmlnamespaces ('http://schemas' as ns1, default 'http://schemas')
select @x.value('(//SourceIdentifierPair[Source=''ABCPN'']/Identifier)[1]', 'nvarchar(32)') IdentifierABCPN
--more complex version of the above code (may be useful should you have more complex requirements in future)
;with xmlnamespaces ('http://schemas' as ns1)
select @x.value('(/ns1:SourceIdentifierPairs/ns1:SourceIdentifierPair[./ns1:Source/text()[.=''ABCPN'']]/ns1:Identifier/text())[1]', 'nvarchar(32)') IdentifierABCPN
Комментарии:
1. Итак, я понимаю это, но XML меняется с каждым сообщением. Это записи, поступающие ежедневно, и мне нужно извлечь ABCPN и сообщить об этом.