Neste exemplo do SQL Server OPENXML:
declare @xmldata xml
set @xmldata =
'<?xml version="1.0"?>
<wddxPacket version="1.0">
<data>
<var dimension="task"><string>Task 1</string></var>
<var dimension="startdate"><string>2020-11-14</string></var>
</data>
<data>
<var dimension="startdate"><string>2020-11-15</string></var>
<var dimension="task"><string>Task 2</string></var>
</data>
</wddxPacket>'
DECLARE @hDoc int
EXEC sp_xml_preparedocument @hDoc OUTPUT, @xmldata
SELECT *
FROM OPENXML(@hDoc, '//wddxPacket/data',2)
WITH(
task varchar(200) 'var[1]/string',
startdate varchar(200) 'var[2]/string'
)
EXEC sp_xml_removedocument @hDoc
Esta é a saída atual:
task startdate
------ ----------
Task 1 2020-11-14
2020-11-15 Task 2
Mas eu realmente quero essa saída:
task startdate
------ ----------
Task 1 2020-11-14
Task 2 2020-11-15
Para identificar o conteúdo, não posso usar "var" sozinho, pois todos os elementos de interesse são denominados "var". Não posso usar a posição [1] ou [2], porque os números de posição são inconsistentes no XML, resultando na saída atual misturada. Como identifico os elementos com base nos nomes dos atributos "var" e "dimension" de "task" ou "startdate"?
Você precisa usar uma expressão XPath diferente para corresponder aos valores de atributo, por exemplo,
var[@dimension="task"]/string
.Assim:
saídas