Pourquoi T-SQL OpenXML décompose-t-il avec certains caractères?
Question
J'ai le code XML suivant que j'utilise dans SQL Server et il se casse, pourquoi?
declare @xml varchar(max)
declare @hDoc int
set @xml = '<transaction>
<item itemId="1" value="Hello World" />
<item itemId="2" value="Hello &World" />
<item itemId="3" value="Hello <World" />
<item itemId="4" value="Hello >World" />
<item itemId="5" value="Hello ’World" />
</transaction>'
exec sp_xml_preparedocument @hDoc OUTPUT, @xml
select
itemId
, value
from
openxml(@hDoc, '/transaction/item')
with (
itemId int,
value varchar(max)
) item
La solution
Les valeurs dans le XML contiennent des caractères non valides. Pour XML en général, vous devez vous échapper du signe inférieur à et de l'esperluette comme ceci: & amp; lt; et & amp;
declare @xml varchar(max)
declare @hDoc int
set @xml = '<transaction>
<item itemId="1" value="Hello World" />
<item itemId="2" value="Hello &World" />
<item itemId="3" value="Hello <World" />
<item itemId="4" value="Hello >World" />
</transaction>'
exec sp_xml_preparedocument @hDoc OUTPUT, @xml
select
itemId
, value
from
openxml(@hDoc, '/transaction/item')
with (
itemId int,
value varchar(max)
) item
Cependant, lors de l’utilisation de openxml, certaines valeurs ne fonctionneront pas, en particulier cette apostrophe frisée. Je ne sais pas quelles valeurs ne sont pas valides, mais je sais que c'est l'une d'entre elles. La solution consiste donc à utiliser le type XML natif dans SQL Server 2005.
declare @xml xml
set @xml = '<transaction>
<item itemId="1" value="Hello World" />
<item itemId="2" value="Hello &World" />
<item itemId="3" value="Hello <World" />
<item itemId="4" value="Hello >World" />
<item itemId="5" value="Hello ’World" />
</transaction>'
select
item.value('@itemId', 'int')
, item.value('@value', 'varchar(max)')
from @xml.nodes('/transaction/item') [transaction](item)
Autres conseils
Si possible, assemblez votre document XML dans l'application. La structure (.Net, Java, ...?) Effectuera le codage approprié pour vous et générera un code XML valide.