首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

如何读取用户自己定义的XML

2013-09-12 
怎么读取用户自己定义的XML一般在存储过程里,遇到前台传入的XML可以用类似如下的语句--@XmlDocument是前台

怎么读取用户自己定义的XML
一般在存储过程里,遇到前台传入的XML可以用类似如下的语句


--@XmlDocument是前台传入的xml 类型是 varchar(max)

EXEC sp_xml_preparedocument @DocHandle OUTPUT, @XmlDocument
insert into #XMLTable
SELECT * FROM OPENXML (@DocHandle, '/Roots/Base',2)
WITH (
f1 varchar(20),
f2 uniqueidentifier, 
f3  float,        
         ……
         ……
)

之所以能用 f1,f2,是因为XML里,在 /Roots/Base  下一层,就是各个f1,f2的定义。

但是现在前台的XML,其f1,f2变成了用户定义。
<root>
 <base>
  <aaa id="0", desc="aaa",xxxxxxxxx>
   <aa1 xxxxxx></aa1>
  </aaa>
  <bbb id="2",desc="bbb", xxxxx>
  </bbb>
……
……
   </base>
</root>
这里,aaa和bbb是任意的。每一层底下有几个子节点,也是任意的(类似aa1)。每一层的描述也是任意的,但是都有id和desc

现在要把这样的XML保存到一个表里,字段是 name,id,desc
改怎么写?
以上面的XML为例子,表里应该是
name id desc
aaa  0   aaa
bbb  2   bbb
  



[解决办法]
参考例子:


DECLARE @XmlDocumentHandle int
DECLARE @XmlDocument nvarchar(4000)
SET @XmlDocument = N'<ROOT>
<Customer>
   <CustomerID>VINET</CustomerID>
   <ContactName>Paul Henriot</ContactName>
   <Order OrderID="10248" CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
      <OrderDetail ProductID="11" Quantity="12"/>
      <OrderDetail ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer>   
   <CustomerID>LILAS</CustomerID>
   <ContactName>Carlos Gonzlez</ContactName>
   <Order OrderID="10283" CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">


      <OrderDetail ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'

EXEC sp_xml_preparedocument @XmlDocumentHandle OUTPUT, @XmlDocument

SELECT    *
FROM OPENXML (@XmlDocumentHandle, '/ROOT/Customer',2)
     WITH (CustomerID  varchar(10),ContactName varchar(20))
     
SELECT    *
FROM OPENXML (@XmlDocumentHandle, '/ROOT/Customer/Order',1)
     WITH (OrderID varchar(10),CustomerID varchar(10), EmployeeID int,OrderDate datetime)

EXEC sp_xml_removedocument @XmlDocumentHandle
/*
CustomerIDContactName
VINETPaul Henriot
LILASCarlos Gonzlez



OrderIDCustomerIDEmployeeIDOrderDate
10248VINET51996-07-04 00:00:00.000
10283LILAS31996-08-16 00:00:00.000
*/


[解决办法]
你直接 SELECT * FROM OPENXML (@DocHandle, '/Roots/Base',2)
然后根据父节点和内部节点关系去分析,就OK了。

热点排行