如何使用sp_xml_preparedocument处理XML文档

  介绍

如何使用sp_xml_preparedocument处理XML文档,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

有时会在存储过程中处理一些XML格式的数据,所以会用到sp_xml_preparedocument,他可以将XML数据进行读取,然后使用MSXML分析器(Msxmlsql.dll)对其进行分析。我们就可以很容易的在存储过程中得到XML中我们想要的数据。下面的代码就是使用sp_xml_preparedocument读取XML:代码如下:   声明@hdoc int声明@doc varchar(1000)设置@doc=& # 39;& lt; ROOT>& lt;客户CustomerID=癡INET"联系名称=氨B轍enriot"比;& lt;订单CustomerID=癡INET"EmployeeID=?”;OrderDate=?996 - 07 - 04 - t00:00:00"比;& lt; OrderDetail OrderID=?0248”;ProductID=?1”;数量=?2“/比;& lt; OrderDetail OrderID=?0248”;ProductID=?2”;数量=?0“/比;& lt;/Order>& lt;/Customer>& lt;客户CustomerID=癓ILAS"联系名称=翱逅笹onzlez"比;& lt;订单CustomerID=癓ILAS"EmployeeID=?”;OrderDate=?996 - 08 - 16 - t00:00:00"比;& lt; OrderDetail OrderID=?0283”;ProductID=?2”;数量=?“/比;& lt;/Order>& lt;/Customer>& lt;/ROOT> & # 39;EXEC sp_xml_preparedocument @hdoc输出,@doc

上面只是读取了XML,要想获取XML数据还需要使用OPENXML,代码如下:代码如下:   SELECT * FROM openxml(@hdoc,'/ROOT/Customer',1) WITH (CustomerID VARCHAR(40),ContactName VARCHAR(40))

OPENXML有三个参数: 第一个是sp_xml_preparedocument读取是的OUTPUT参数,在本示例中就是@hdoc; 第二个是一个XPath表达式,用来获取指定位置的数据; 第三个是一个可选项,用来表示获取的方式,有0,1,2,8四种取值,详细解释请看 FROM后面的WITH也是可选的,用来指定获取哪些数据字段,上面代码中只取了CustomerID和ContactName。上面的查询结果如下: CustomerID ContactName —————————————- —————————————- VINET Paul Henriot LILAS Carlos Gonzlez 如果不指定WITH子句,查询出来的是一个默认的表结构,如下:

表格列的解释说明:

idbigint文档节点的唯一 ID。

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

parentidbigint标识节点的父节点。此 ID 标识的父节点不一定是父元素。具体情况取决于此 ID 所标识节点的子节点的节点类型。例如,如果节点为文本节点,则其父节点可能是一个属性节点。

如果节点位于 XML 文档的顶层,则其 ParentID 为 NULL。

节点类型int标识节点类型,是对应于 XML 对象模型 (DOM) 节点类型编号的一个整数。

下列值是可以显示在此列中以指明节点类型的值:

1=元素节点

2=属性节点

3=文本节点

4=CDATA 部分节点

5=实体引用节点

6=实体节点

7=处理指令节点

8=注释节点

9=文档节点

10=文档类型节点

11=文档片段节点

12=表示法节点

有关详细信息,请参阅 Microsoft XML (MSXML) SDK 中的“节点类型属性”主题。

localnamenvarchar(max)提供元素或属性的本地名称。如果 DOM 对象没有名称,则为 NULL。prefixnvarchar(max)节点名称的命名空间前缀。namespaceurinvarchar(max)节点的命名空间 URI。如果值是 NULL,则命名空间不存在。datatypenvarchar(max)元素或属性行的实际数据类型,否则是 NULL。数据类型是从内联 DTD 中或从内联架构中推断得出。prevbigint前一个同级元素的 XML ID。如果前面没有同级元素,则为 NULL。textntext包含文本形式的属性值或元素内容。如果边缘表项不需要值则为 NULL。

列名数据类型说明

在WITH子句中,我们还可以通过设置来获取父级元素的属性值: 代码如下:   声明@hdoc int声明@doc varchar(1000)设置@doc=& # 39;& lt; ROOT>& lt;客户CustomerID=癡INET"联系名称=氨B轍enriot"比;& lt;订单OrderID=?0248”;CustomerID=癡INET"EmployeeID=?”;OrderDate=?996 - 07 - 04 - t00:00:00"比;& lt; OrderDetail ProductID=?1”;数量=?2“/比;& lt; OrderDetail ProductID=?2”;数量=?0“/比;& lt;/Order>& lt;/Customer>& lt;客户CustomerID=癓ILAS"联系名称=翱逅笹onzlez"比;& lt;订单OrderID=?0283”;CustomerID=癓ILAS"EmployeeID=?”;OrderDate=?996 - 08 - 16 - t00:00:00"比;& lt; OrderDetail ProductID=?2”;数量=?“/比;& lt;/Order>& lt;/Customer>& lt;/ROOT> & # 39;EXEC sp_xml_preparedocument @hdoc输出,@doc SELECT * FROM OPENXML (@hdoc & # 39;/根/客户/订单/OrderDetail& # 39;(2)与(OrderID int & # 39; . ./@OrderID& # 39;, CustomerID varchar (10) & # 39; . ./@CustomerID& # 39;, OrderDate datetime & # 39; . ./@OrderDate& # 39;, ProdID int & # 39; @ProductID& # 39;,数量int & # 39; @Quantity& # 39;)

如何使用sp_xml_preparedocument处理XML文档