使用.NET存储XML数据

34、深入探索ASP.NET数据存储与SQL Server XML支持 本博客深入探讨了ASP.NET中的多种数据存储对象,包括Session、Application、Cache和数据库存储,并结合实例演示如何创建一个简单的购物车应用程序。此外,还详细介绍了SQL Server对XML的强大支持,涵盖FOR XML子句的不同模式及其选项,同时讲解了XPath、XSLT、通过HTTP访问SQL Server、使用OPENXML函数以及在C#中处理XML的XmlDocument和XmlDataDocument对象。这些内容为开发高效灵活的Web应用提供了全面的技术支持。 阅读详情
SQL Server 2000和XML for SQL Server 2000 Web版本(SQLXML)提供了三种存储XML数据的途径:XML Bulk Load和Updategrams,这两种客户端技术使用带有注解的大纲指定XML文档内容和数据库的表之间的映射;OpenXML是一种服务器端技术,它允许你在XML文档上定义关系视图,有了OpenXML的关系视图,你就能使用T-SQL代码查询XML文档中的数据并把结果存储在你的SQL Server数据库中。

  这三种技术中的每一种都是为特定的目的设计的。XML Bulk Load把来自很大的XML文档的数据存储在SQL Server中;Updategrams执行SQL Server数据的优化更新(优化更新是没有锁(lock)的更新,在这种更新中系统检测是否有其它用户在原来读取数据后改变了它);OpenXML提供了人们熟悉的XML数据关系访问方法。

  在这三种技术中,OpenXML是最灵活的,因为它提供了一个编程模型(T-SQL),在把XML数据存储在SQL Server数据库之前,你可以使用这种编程模型在XML数据上编写业务规则或执行计算逻辑。但是,由于OpenXML是一种基于服务器的技术,如果你频繁的使用它或者有大量的文档,它会降低SQL Server的性能。不过,如果你采用了微软.NET框架组件,你就可以使用ADO.NET的数据集绕开这些性能和可伸缩性方面的限制,ADO.NET数据集赋予你一个强大的技术--为把XML数据存储在SQL Server包含了一个完整的编程模型。

  数据集、数据表和XML映射

  你可以使用数据集简单地从SQL Server中生成XML查询结果。通过提供一种可以在客户端和中间层计算机上使用的关系数据缓存(cache),数据集能够载入和维护多种数据源(包括SQL Server、其它的关系型数据库和XML)中的数据。

  当你从XML文档中载入一个数据集的时候,该数据集必须把存储在层次XML表现(representation)中的数据映射成数据集的关系表现。例如,如果你的XML文档包含一个Order元素列表,而它又有一个作为子元素的嵌套的LineItem元素,那么通常这个文档被映射成关系表现中的Orders和LineItems数据表。这种映射的目的与OpenXML使用Xpath查询构造XML文档上的关系视图的方法的目的是一样的。但是与使用Xpath规范不同,数据集有自己的映射数据的方式。

  数据集使用XML大纲定义(XSD)大纲把数据从XML文档映射到数据集的关系数据缓存中。数据集为你提供了指定映射XML数据的大纲的两种方法。首先,你可以引用一个定义了XML文档中使用的元素,属性和关系的XSD大纲。另一种方法是,你可以直接从文档的结构中推理大纲。换句话说,数据集可以通过检查XML文档的结构和内容建立大纲。

  当你引用XSD大纲的时候,数据集使用这个大纲中定义的元素、属性与元素之间的关系来构造关系数据缓存中的数据表、数据列和数据关系,你可以使用这个数据缓存存储被映射的XML数据。我谈到关系数据缓存中的结构或大纲的时候,一般把它称为数据缓存的形式。当数据集处理大纲的时候,它会应用一组规则,这种规则与映射大纲中没有指定注解时Updategrams 和XML Bulk Load使用的默认映射规则相似,数据集使用这种规则建立数据集用于存储被映射的XML数据的表。数据集的映射规则概述如下:

  · 复合元素--即包含其它元素或属性的元素--被映射成表。

  · 属性和简单值(simple-valued)子元素--只包含数据,不包含其它元素或属性的元素--被映射成列。

  · 数据类型从XSD类型映射为.NET类型。 

  推理(Inference)是一种快速、方便的把XML文档载入数据集的方法。表、列和关系都是"自我测量"(introspection)自动建立的,"自我测量"是数据集检查XML文档的结构和内容的过程。尽管使用推理明显减少了你的编程负担,但是它也给你的实现带来了不可预测性,因为对XML文档的很小的改动可能引起数据集建立不同形式的表。这些形式的改变可能引起你的应用程序意外中断。因此,我推荐你一般为应用程序引用一个大纲,建立原型的时候限制推理的使用。

  现在让我们看一看如何使用大纲建立一个可用于更新SQL Server数据库的客户端数据集数据缓存的例子。

映射XML订单

  假定你在编写一个接受用户订单的应用程序,订单是XML格式的,它的XSD大纲如图1定义。该大纲定义了三种复合类型,分别提供订单的客户数据、订单数据和线性数据项。一个顶层Customer元素定义了XML文档的根。这个封闭的系统定义了元素之间的关系:Order元素包含了一个LineItem元素,Customer元素包含一个Order元素。图2显示了符合图1定义的大纲的一个XML文档实例。

  图1:XSD大纲

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="urn:Sep2003Example" elementFormDefault="qualified"
xmlns="urn:Sep2003Example"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:complexType name="OrderType">
 <xs:sequence>
  <xs:element name="OrderID" type="xs:integer" />
  <xs:element name="LineItem" type="LineItemType" />
 </xs:sequence>
</xs:complexType>
<xs:complexType name="LineItemType">
 <xs:sequence>
  <xs:element name="ProductID" type="xs:int" />
  <xs:element name="Quantity" type="xs:int" />
  <xs:element name="UnitPrice" type="xs:decimal" />
 </xs:sequence>
</xs:complexType>
<xs:complexType name="CustomerType">
 <xs:sequence>
  <xs:element name="CustomerID" type="xs:string" />
  <xs:element name="Order" type="OrderType" />
 </xs:sequence>
</xs:complexType>
<xs:element name="Customer" type="CustomerType">
</xs:element>
</xs:schema>

  图2:一个XML文档示例

<?xml version="1.0" ?>
 <Customer xmlns="urn:Sep2003Example">
  <CustomerID>ALFKI</CustomerID>
  <PO>9572658</PO>
  <Address>
  <Street>One Main Street</Street>
  <City>Anywhere</City>
  <State>NJ</State>
  <Zip>08080</Zip> </Address>
  <Order>
   <OrderID>10966</OrderID>
   <LineItem>
    <ProductID>37</ProductID>
    <UnitPrice>26.50</UnitPrice>
    <Quantity>8</Quantity>
    <Description>Gravad lax</Description>
   </LineItem>
   <LineItem>
    <ProductID>56</ProductID>
    <UnitPrice>38.00</UnitPrice>
    <Quantity>12</Quantity>
    <Description>Gnocchi di nonna Alice</Description>
   </LineItem>
  </Order>
 </Customer>

  列表1中显示的C#代码使用ReadXmlSchema方法把图1中的大纲载入一个叫作orderDS的数据集中。ReadXmlSchema建立了三个数据表,它们分别与大纲中定义的Customer、Order和LineItem元素对应。因此你可以验证这个大纲在关系数据缓存中建立了预期的表,printDSShape方法把每个表的名称写到控制台上,后面跟着列的列表和每列的数据类型。

  列表1: 建立关系数据缓存的C#代码

using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;
using System.Xml;

public class XMLMap
{
public static void Main()
{

// 建立数据集和读取大纲
DataSet orderDS = new DataSet("CustOrder");
orderDS.ReadXmlSchema("CustOrderLitem.xsd");

// 打印数据集的形式
printDSShape(orderDS);

// 把一个XML格式的订单读入数据集
orderDS.ReadXml("Order.xml",System.Data.XmlReadMode.IgnoreSchema);

// 打印数据集中的数据
printDSData(orderDS);

// 此处插入业务规则和数据库更新逻辑
}

private static void printDSShape(DataSet ds)
{
foreach (DataTable dt in ds.Tables)
{
Console.WriteLine("{0}",dt.TableName);

// 打印列的名称和类型
foreach (DataColumn dc in dt.Columns)
Console.WriteLine("/t{0}/t{1}",dc.ColumnName,dc.DataType.ToString());
}
}

private static void printDSData(DataSet ds)
{
foreach (DataTable dt in ds.Tables)
{
Console.WriteLine("/n{0}:", dt.TableName);

// 打印列的头
foreach (DataColumn dc in dt.Columns)
Console.Write("{0}/t",dc.ColumnName);
Console.WriteLine("");

// 输出数据
foreach (DataRow dr in dt.Rows)
{
foreach(DataColumn dc in dt.Columns)
System.Console.Write("{0}/t",dr[dc]);
System.Console.WriteLine("");
}
}
}
}

  仔细查看一下列的名称。尽管大纲中没有指定Customer_Id和Order_Id列,但是它们还是出现在数据表中。ReadXmlSchema给数据集自动添加这些列。数据集把这些列用作外部键(foreign key),以模拟Customer元素与它的Order元素之间、Order元素与它的LineItem元素之间的关系。因为典型情况下XML使用嵌套的关系代替了外部键,所以数据集自动生成自己的主键、数据表之间的外部键,并把它们存储在这些列中。

  请同时仔细查看图3中的数据类型--数据集已经把来自XML大纲数据类型的数据类型映射为对应的.NET数据类型。当你把XML文档载入数据集的时候,该数据集把来自XML的每一个值转换为对应的.NET类型。

  图3:生成的数据类型和记录

Customer
CustomerID System.String
Customer_Id System.Int32

Order
OrderID System.Int64
Order_Id System.Int32
Customer_Id System.Int32

LineItem
ProductID System.Int32
Quantity System.Int32
UnitPrice System.Decimal
Order_Id System.Int32

Customer:
CustomerID Customer_Id
ALFKI 0

Order:
OrderID Order_Id Customer_Id
10966 0 0

LineItem:
ProductID Quantity UnitPrice Order_Id
37 8 26.5 0
56 12 38 0

  把大纲载入数据集之后,为了完成关系映射,你需要做的所有事情就是把XML数据载入该数据集。列表1的ReadXml方法打开叫作Order.xml的文件,该文件如图2所示。接着,它把文件中的数据读取到你刚才读取大纲建立的数据集中的数据表里。你的XML订单现在可以通过数据集访问了。

  为了演示如何访问数据集中的数据,列表1的printDSData方法在数据表中导航,对于每张表,都显示列的名称,紧接着显示这张表的所有的行。图3显示为ReadXmlSchema方法给数据集添加的Customer_Id和Order_Id列自动生成了值。

  请注意,Order.xml出现的三个元素--PO、Address和Description--没有映射到数据表中。这些数据被忽略了,因为你提供给数据集的大纲没有包含这些元素,当数据集建立关系数据缓存的外形并载入XML数据的时候,它简单地忽略了没有在大纲中描述的数据。即使在你从客户那儿接收到的XML订单中包含了没有预料到的额外数据,这种简便特性也可以让你的代码正常地工作。

  建立使用数据缓存的应用程序

  现在你已经知道如何使用数据集为XML数据建立关系数据缓存了,你可以应用这种技术来实现一个执行业务逻辑并更新SQL Server的应用程序。当你使用数据集编程模型的时候实现业务逻辑相对直接。ADO.NET为你提供了更新SQL Server中数据的几种选择,包括使用数据适配器、编写自己的查询,以及执行存储过程。数据集使把XML数据映射成关系模型很容易,剩余的事情是你的了。

asp.net 读取XML文件中的数据和写入数据库实例 通过页面把信息添加到数据库,然后查询数据把信息添加到xml文件中,在页面上显示信息。 立即下载

相关推荐

asp.net 操作XML 按指定格式写入XML数据 WriteXml

从SQL下载数据到本地为XML文件

.net中如何打日志

引言                在配合移动端调试接口的时候发现没法进项调试。只能在项目中将需要的一些东西返回给移动端进行查看,很不方便。然后就想到了将信息输出到文件。但这样需要在程序中写很多代码。于是想到了能不能封装起来。于是想不到了日志。前段时间经理开会曾说过,debug是最普通的程序员干的事,高级程序员一般都要打日志的。借这个机会,研究了一下打日志,将其实现在项目中。 步骤 1

我翱翔的天空 3213

ROS2实战:从零部署Cartographer激光SLAM系统

本文详细介绍了在ROS2 Humble环境下,从零开始部署Cartographer激光SLAM系统的完整实战流程。内容涵盖环境准备、Cartographer安装(APT与源码编译两种方式对比)、工作空间与功能包创建、核心启动文件与Lua配置文件编写、系统构建与可视化启动,以及地图保存与实战调参技巧,帮助开发者快速构建稳定可靠的机器人SLAM应用。

weixin_29213655的博客 248

asp.net输出纯xml格式数据

只保留以上这行代码。 .cs文件主要是: public partial class Server01 : System.Web.UI.Page ...{ private string connString = @"server=BJ2-JIANGFJFDBSERVER;Trusted_Connection=false;database=TestDB;uid=sa;pwd=7929009"

Devaz的空间 1145

「分治法」最近点对距离问题

一、问题描述 给定平面S上n个点,找其中的一对点,使得在n个点组成的 所有点对中,该点对间的距离最小。 假设所讨论的点是以标准笛卡儿坐标形式(x, y)给出的。因 此,在两个点Pi =(xi , yi )和Pj =(xj , yj )之间的距离是标准的欧几里德 距离: d = 根号下( x i − x j ) 2 + ( y i − y j )2 二、问题分析 直接用暴力解法很简单,用结构体把每个点的x、y坐标都存下来之后,用一个二重循环即可获得距离的最大值。但是这样做的时间复杂度也达到了O(n的平方)

Laok0413的博客 9656

MATLAB/Simulink实战:三电平逆变器SVPWM调制从入门到精通(附完整仿真模型)

本文提供了一份详尽的MATLAB/Simulink实战指南,手把手教你从零搭建三电平逆变器的SVPWM调制系统。文章深入剖析了27个空间矢量的分区与分解算法,并完整实现了包含中点电位平衡控制的Simulink仿真模型,旨在帮助电力电子与电机控制领域的学习者和工程师跨越从理论到实践的鸿沟。

sugar的博客 1213

.net保存数据到XML文件中

这个是把对新闻的评论保存到一个指定的xml文件中,只是一个对xml文件的读写过程。环境是vs2005。1xml文件Comment.xmlxml version="1.0" encoding="utf-8"?>AllComment>   Comment NewsId="152">     CommentContent>3333333333CommentContent>     AddTi

死亡凋零的专栏 1852

OpenClaw 在 Windows 环境下的完整安装、配置和部署指南

介绍Windows环境下OpenClaw的完整安装,配置和部署的全流程

hxbao的专栏 1485

.Net大量数据的存储处理的方式

.Net大量数据的存储处理的方式 ① List ② Vector ③ Hashtable 是以键值对的形式存储数据 转载于:https://www.cnblogs.com/YangBinChina/archive/2012/09/08/2676347.html...

weixin_30635053的博客 294

图像做旧算法原理及代码解释

该图像做旧算法主要通过一系列的图像处理操作来模拟旧照片的效果。整体流程包括:首先对输入图像进行颜色调整,降低饱和度并增加黄色调以营造出旧照片的色彩风格;接着添加高斯噪声来模拟旧照片可能存在的颗粒感;最后通过在图像上随机绘制线条来模拟旧照片的划痕和瑕疵。综上所述,该图像做旧算法通过对颜色的调整(包括饱和度降低、色相偏移)、添加高斯噪声以及模拟划痕和瑕疵等一系列操作,从多个方面模拟了旧照片的特征。

m0_44975814的博客 901

rk3568 rk628桥片 rgb2hdmi

RK628 是瑞芯微全新推出的视频桥接芯片,支持丰富的显示接口,支持高分辨率大屏产品转换需求。基于DRM、FB的显示框架易于使用。 输入信号支持:HDMI、RGB、BT.1120,输出信号支持 HDMI、GVI、Dual LVDS、Dual MIPI、MIPI-CSI、RGB、BT.1120,最高支持4K 60fps 输入/输出转换,并且支持输入到输出 1/4~4倍的缩放。

weixin_35723192的博客 452

【原创】开源.NET下的XML数据库介绍及入门

本博客所有文章分类的总目录:【总目录】本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:【目录】本博客其他.NET开源项目文章目录 1.前言 有时候尝试未必是坏事,不断尝试新事务,才能发现新东西,增加阅历,才能更容易面对复杂的情况。今天给大家带来的是一个.NET下开源的XML数据库。比较好用,轻量级,小巧,可以满足一些特殊的变态的需求。比如我这次遇到的。...

alad64007的博客 130

uniapp+google map不显示

uniapp+renderJS+google map开发安卓版APP非小程序,google map小叉号不显示,google map自定义marker右上角的小叉号如何去掉,uniapp+google map不显示

renkai721的专栏 527

使用.NET存储XML数据(一)

SQL Server 2000和XML for SQL Server 2000 Web版本(SQLXML)提供了三种存储XML数据的途径:XML Bulk Load和Updategrams,这两种客户端技术使用带有注解的大纲指定XML文档内容和数据库的表之间的映射;OpenXML是一种服务器端技术,它允许你在XML文档上定义关系视图,有了OpenXML的关系视图,你就能使用T-SQL代码查询XML

wgscd blog 789

级联H桥构网型储能SVG系统设计与VSG控制策略研究

随着新能源渗透率不断提高,电力系统惯量和阻尼水平持续下降,传统跟网型控制策略在弱电网条件下的稳定性面临严峻挑战。构网型控制以电压源方式运行,能够为系统提供惯量和频率支撑,成为当前研究热点。本文针对10kV/10Mvar级联H桥构网型储能静止无功发生器(SVG),采用星形连接拓扑结构,设计了基于虚拟同步发电机(VSG)的构网型控制策略。文章从主电路拓扑设计、数学建模、VSG控制策略设计、调制策略、直流电压平衡控制、系统参数设计、仿真建模和硬件实现等八个方面展开系统论述,给出了完整的Simulink仿真模型~~

huanghm88的专栏 349

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

一起谈.NET技术,浅谈如何使用.NET存储XML数据

  XML Bulk Load和Updategrams,这两种客户端技术使用带有注解的大纲指定XML文档内容和数据库的表之间的映射;OpenXML是一种服务器端技术,它允许你在XML文档上定义关系视图,有了OpenXML的关系视图,你就能使用T-SQL代码查询XML文档中的数据并把结果存储在你的SQL Server数据库中。   这三种技术中的每一种都是为特定的目的设计的。XML Bulk Lo...

weixin_34413103的博客 79

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

使用.NET存储XML数据(二)

映射XML订单  假定你在编写一个接受用户订单的应用程序,订单是XML格式的,它的XSD大纲如图1定义。该大纲定义了三种复合类型,分别提供订单的客户数据、订单数据和线性数据项。一个顶层Customer元素定义了XML文档的根。这个封闭的系统定义了元素之间的关系:Order元素包含了一个LineItem元素,Customer元素包含一个Order元素。图2显示了符合图1定义的大纲的一个XML文档实例

wgscd blog 568

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

XML数据库

http://www.cnblogs.com/chenxizhang/archive/2009/08/08/1541888.html 这是我正在开发的一个产品。很好理解,它是一个数据库产品(或者称为解决方案),而且它直接就用XML存储数据。 以下是一些基本介绍:   区别于现行的主流数据库,它的数据就是直接用XML文件存储的,而且它不是一个简单的关系型,也不是二维的。一份表格中的数据可

blog of eulota 1079
上一篇: Visual Basic.NET和GDI+共创图标编辑器
下一篇: 利用XSLT把ADO记录集转换成XML
slightboy
博客等级 码龄23年 3粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值