解析一些xml时遇到问题

时间:2015-08-05 00:40:50

标签: sql sql-server xml parsing namespaces

我正在尝试解析已经放入列中的一些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

对于这两个值(nullnamecode),我得到addresscode。我应该在name中获得namecode值,在address中获得addresscode值。

2 个答案:

答案 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