我正在尝试解析已经放入列中的一些XML。为简化起见,我将XML直接放入变量并尝试在此解析它。
Declare @XMLToParse XML
SELECT @XMLToParse = '<?xml version="1.0" encoding="UTF-8"?>
<atn:Transaction xmlns:atn="http://www.agcs.com/Transaction/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.agcs.com/Transaction/cosmos.xsd">
<name>AIRW0043</name>
<address>654577</address>
</atn:Transaction>'
;WITH XMLNAMESPACES(DEFAULT 'http://www.agcs.com/Transaction/cosmos.xsd',
'http://www.agcs.com/Transaction/' as atn)
Select @XMLToParse.value('data(/atn:Transaction/name)[1]','VARCHAR(100)') namecode
, @XMLToParse.value('data(/atn:Transaction/address[1]','VARCHAR(100)') addresscode
对于这两个值(null
和namecode
),我得到addresscode
。我应该在name
中获得namecode
值,在address
中获得addresscode
值。
答案 0 :(得分:1)
你需要使用'text()'来获取元素值
$input = array (1, 2, 3, 4, 5, 6, 7, 8);
答案 1 :(得分:1)
实际问题是您在WITH XMLNAMESPACES
语句中设置了默认命名空间。这导致在XPath / XQuery(f.e /name
和/address
)中没有显式前缀的所有元素都被考虑在默认命名空间中 - 而在实际的XML中它们没有命名空间 - 。
简而言之,只需从WITH XMLNAMESPACES
语句中删除默认命名空间:
Declare @XMLToParse XML
SELECT @XMLToParse = '<?xml version="1.0" encoding="UTF-8"?>
<atn:Transaction xmlns:atn="http://www.agcs.com/Transaction/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.agcs.com/Transaction/cosmos.xsd">
<name>AIRW0043</name>
<address>654577</address>
</atn:Transaction>'
;WITH XMLNAMESPACES('http://www.agcs.com/Transaction/' as atn)
Select @XMLToParse.value('data(/atn:Transaction/name)[1]','VARCHAR(100)') namecode
, @XMLToParse.value('data(/atn:Transaction/address)[1]','VARCHAR(100)') addresscode