源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

使用sp_xml_preparedocument处理XML文档的方法

  • 时间:2021-11-01 22:55 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:使用sp_xml_preparedocument处理XML文档的方法
有时会在存储过程中处理一些XML格式的数据,所以会用到[url=http://msdn.microsoft.com/zh-cn/library/ms187367(v=SQL.90)]sp_xml_preparedocument[/url],他可以将XML数据进行读取,然后使用 MSXML 分析器 (Msxmlsql.dll) 对其进行分析。我们就可以很容易的在存储过程中得到XML中我们想要的数据。下面的代码就是使用sp_xml_preparedocument读取XML:
[url=http://www.1sucai.cn/upload/201108/20110831004455344.png][img]http://files.jb51.net/upload/201108/20110831004455344.png[/img] [/url] 表格列的解释说明:
列名 数据类型 说明
[b]id[/b] [b]bigint[/b] 文档节点的唯一 ID。

根元素的 ID 值为 0。保留负 ID 值。

[b]parentid[/b] [b]bigint[/b] 标识节点的父节点。此 ID 标识的父节点不一定是父元素。具体情况取决于此 ID 所标识节点的子节点的节点类型。例如,如果节点为文本节点,则其父节点可能是一个属性节点。 如果节点位于 XML 文档的顶层,则其[b]ParentID[/b] 为 NULL。
[b]节点类型[/b] [b]int[/b] 标识节点类型,是对应于 XML 对象模型 (DOM) 节点类型编号的一个整数。 下列值是可以显示在此列中以指明节点类型的值: [b]1[/b] = 元素节点 [b]2[/b] = 属性节点 [b]3[/b] = 文本节点 [b]4[/b] = CDATA 部分节点 [b]5[/b] = 实体引用节点 [b]6[/b] = 实体节点 [b]7[/b] = 处理指令节点 [b]8[/b] = 注释节点 [b]9[/b] = 文档节点 [b]10[/b] = 文档类型节点 [b]11[/b] = 文档片段节点 [b]12[/b] = 表示法节点 有关详细信息,请参阅 Microsoft XML (MSXML) SDK 中的“节点类型属性”主题。
[b]localname[/b] [b]nvarchar(max)[/b] 提供元素或属性的本地名称。如果 DOM 对象没有名称,则为 NULL。
[b]prefix[/b] [b]nvarchar(max)[/b] 节点名称的命名空间前缀。
[b]namespaceuri[/b] [b]nvarchar(max)[/b] 节点的命名空间 URI。如果值是 NULL,则命名空间不存在。
[b]datatype[/b] [b]nvarchar(max)[/b] 元素或属性行的实际数据类型,否则是 NULL。数据类型是从内联 DTD 中或从内联架构中推断得出。
[b]prev[/b] [b]bigint[/b] 前一个同级元素的 XML ID。如果前面没有同级元素,则为 NULL。
[b]text[/b] [b]ntext[/b] 包含文本形式的属性值或元素内容。如果边缘表项不需要值则为 NULL。

在WITH子句中,我们还可以通过设置来获取父级元素的属性值:
[u]复制代码[/u] 代码如下:
DECLARE @hdoc int DECLARE @doc varchar(1000) SET @doc =' <ROOT> <Customer CustomerID="VINET" ContactName="Paul Henriot"> <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" ContactName="Carlos Gonzlez"> <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 @hdoc OUTPUT, @doc SELECT * FROM OPENXML (@hdoc, '/ROOT/Customer/Order/OrderDetail',2) WITH (OrderID int '../@OrderID', CustomerID varchar(10) '../@CustomerID', OrderDate datetime '../@OrderDate', ProdID int '@ProductID', Qty int '@Quantity')
查询的结果为: OrderID CustomerID OrderDate ProdID Qty ———– ———- ———————– ———– ———– 10248 VINET 1996-07-04 00:00:00.000 11 12 10248 VINET 1996-07-04 00:00:00.000 42 10 10283 LILAS 1996-08-16 00:00:00.000 72 3 有时候XML中的数据并不是以属性的方式存在,而是直接放在节点中,如下:
[u]复制代码[/u] 代码如下:
DECLARE @doc varchar(1000) SET @doc =' <ROOT> <Customer CustomerID="VINET" ContactName="Paul Henriot"> <Order> <OrderID>10248</OrderID> <CustomerID>VINET</CustomerID> <EmployeeID>5</EmployeeID> <OrderDate>1996-07-04T00:00:00</OrderDate> </Order> </Customer> </ROOT>'
此时要获Order节点下的各项的值,可以用下面方法:
[u]复制代码[/u] 代码如下:
DECLARE @hdoc int DECLARE @doc varchar(1000) SET @doc =' <ROOT> <Customer CustomerID="VINET" ContactName="Paul Henriot"> <Order> <OrderID>10248</OrderID> <CustomerID>VINET</CustomerID> <EmployeeID>5</EmployeeID> <OrderDate>1996-07-04T00:00:00</OrderDate> </Order> </Customer> </ROOT>' EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc SELECT * FROM OPENXML (@hdoc, '/ROOT/Customer/Order',1) WITH (OrderID int 'OrderID', CustomerID varchar(10) 'CustomerID', EmployeeID int 'EmployeeID', OrderDate datetime 'OrderDate')
查询结果如下: OrderID CustomerID EmployeeID OrderDate ———– ———- ———– ———————– 10248 VINET 5 1996-07-04 00:00:00.000 可以看出是取属性值还是取节点的文本的值区别在于WITH子句的第三个参数是否有@符号
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部