【问题标题】:Having trouble parsing some xml解析某些 xml 时遇到问题
【发布时间】:2015-08-05 00:40:50
【问题描述】:

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

两个值(namecodeaddresscode)我都得到了 null。我应该得到namecode 中的name 值和addresscode 中的address 值。

【问题讨论】:

    标签: sql sql-server xml parsing namespaces


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      你需要使用'text()'来获取元素值

      ;WITH XMLNAMESPACES('http://www.agcs.com/Transaction/' as atn)
      
      Select  @XMLToParse.value('(/atn:Transaction/name/text())[1]','VARCHAR(100)') namecode
          ,   @XMLToParse.value('(/atn:Transaction/address/text())[1]','VARCHAR(100)') addresscode
      

      【讨论】:

      • 感谢您的回答,但它仍然没有从“地址”和“名称”返回值
      • @radar 实际上在这种特殊情况下这不是问题。无论是否使用/text(),它仍然有效 - 或无效 - 以同样的方式工作
      猜你喜欢
      • 1970-01-01
      • 2013-09-17
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多