简体   繁体   中英

reading xml file with namespace

we need to read a xml file in sql server but we are having problems because the xml have a namespace, I have tried several solutions but I can't resolve the problem.

the xml file looks like this

<?xml version="1.0" encoding="UTF-8"?>
<Status:orders xmlns:Status="http://www.test.com"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test.com Status.xsd">
  <order>
    <Header>
      <Name>500039</Name>
      <Letter>A</Letter> 
    </Header>
  </order>  
</Status:orders>

can you help how to retrieve the values for the Name and letter tags

thanks in advance.

Your friend is called WITH XMLNAMESPACES ...

Try it like this

DECLARE @xml XML=
'<?xml version="1.0" encoding="UTF-8"?>
<Status:orders xmlns:Status="http://www.test.com"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test.com Status.xsd">
  <order>
    <Header>
      <Name>500039</Name>
      <Letter>A</Letter> 
    </Header>
  </order>  
</Status:orders>';

WITH XMLNAMESPACES('http://www.test.com' AS Status)
SELECT @xml.value('(/Status:orders/order/Header/Name)[1]','int')
      ,@xml.value('(/Status:orders/order/Header/Letter)[1]','varchar(max)');

An alternative was, to use the asterisk.

SELECT @xml.value('(/*:orders/order/Header/Name)[1]','int')
      ,@xml.value('(/*:orders/order/Header/Letter)[1]','varchar(max)');

Another alternative was this:

SELECT @xml.value('(//Name)[1]','int')
      ,@xml.value('(//Letter)[1]','varchar(max)');

But in general it is good advice, to be as specific as possible...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM