首页 文章

xmlns的XML提取问题

提问于
浏览
0

我有一些标准的XML代码,我试图提取,我已经阅读了关于xmlns的各种不同的问题,并且我的代码到目前为止,但我似乎无法做的是提取“ “对于CustomerID -

DECLARE @docHandle INT 
DECLARE @XmlDocument NVARCHAR(1000) 
DECLARE @rootxmlns VARCHAR(1000) 

SET @XmlDocument ='  
<Root xmlns="http://www.adventure-works.com">   
 <Customers>     
  <Customer CustomerID="GREAL">       
   <CompanyName>Great Lakes Food Market</CompanyName>       
   <ContactName>Howard Snyder</ContactName>       
   <ContactTitle>Marketing Manager</ContactTitle>
   <Phone>(503) 555-7555</Phone>       
  </Customer>     
 </Customers>  
</Root>  ' 
SET @rootxmlns = '<Root xmlns:hm="http://www.adventure-works.com"/>' 

-- Create an internal representation of the XML document.   
EXEC Sp_xml_preparedocument 
@docHandle output, 
@XmlDocument, 
@rootxmlns 

-- Execute a SELECT statement using OPENXML rowset provider.   
SELECT * 
FROM   OPENXML (@docHandle, '/hm:Root/hm:Customers', 3) 
      WITH ([CustomerID]           CHAR(10) './hm:CustomerID'
           ,[Customer.CompanyName] VARCHAR(100)'hm:Customer/hm:CompanyName' 
           ,[Customer.ContactName] VARCHAR(100) 
   'hm:Customer/hm:ContactName' ) 

EXEC Sp_xml_removedocument 
@docHandle

1 回答

  • 1

    使用 FROM OPENXML 的方法以及用于创建和删除XML文档的存储过程已经过时,不应再使用 . 更好,更快,更容易阅读the native XML methods(自2005年以来一些支持) .

    我将您的XML放在一个本机声明的变量中 . 但是,您可以将此方法内联到任何针对表数据的查询中,这允许在VIEW和iTVF中使用XML .

    DECLARE @XmlDocument XML;
    
    SET @XmlDocument ='  
    <Root xmlns="http://www.adventure-works.com">   
     <Customers>     
      <Customer CustomerID="GREAL">       
       <CompanyName>Great Lakes Food Market</CompanyName>       
       <ContactName>Howard Snyder</ContactName>       
       <ContactTitle>Marketing Manager</ContactTitle>
       <Phone>(503) 555-7555</Phone>       
      </Customer>     
     </Customers>  
    </Root>';
    
    • 首先,我们声明默认命名空间( xmlns="Some URI"
    WITH XMLNAMESPACES(DEFAULT 'http://www.adventure-works.com') 
    SELECT c.value('(Customer/@CustomerID)[1]','nvarchar(max)') AS CustomerID
          ,c.value('(Customer/CompanyName/text())[1]','nvarchar(max)') AS CompanyName
          ,c.value('(Customer/ContactName/text())[1]','nvarchar(max)') AS ContactName
          ,c.value('(Customer/ContactTitle/text())[1]','nvarchar(max)') AS ContactTitle
          ,c.value('(Customer/Phone/text())[1]','nvarchar(max)') AS Phone
    FROM @XmlDocument.nodes('/Root/Customers') A(c)
    

    <Customers> 的复数我假设,在一个XML中可能有多个客户 . 这就是为什么我使用 .nodes() 来获取所有客户的派生表(将按行每个客户返回) .

    .value() -method将读取第二个参数中提供的特定值 .

相关问题