使用.NET存储XML数据

matlab是用什么语言编写的? MATLAB是一种用于数值计算、可视化以及编程的高级语言和交互式环境。初始由 Cleve Moler 于上世纪 70 年代开发,旨在为简化矩阵计算而设计。如今,MATLAB 是用 C 语言开发的,其中也包含了一些用 Java 编写的界面组件。C 语言为 MATLAB 提供了高效运行的基础,而 Java 组件则丰富了其图形界面,使得 MATLAB 的用户界面更加友好、交互性更强。 阅读详情
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数据映射成关系模型很容易,剩余的事情是你的了。

什么是编程语言或编译器的自举?X语言编译器可以用X语言编写吗?java.exe和javac.exe源代码是用什么编程语言? 编译器的自举(Bootstrapping)是指使用某种编程语言编写该语言自己的编译器。编译器实现自举可证明编译器的正确性和完备性,用同一种语言维护对应编译器也更有亲切感。 阅读详情

相关推荐

如何使用 Java 语言为 Hyperledger Fabric 编写区块链链代码智能合约

面向 Java 开发人员的链代码简介 您或许听说过区块链,但可能不确定它对 Java™ 开发人员有何用。本教程将帮助大家解惑。我将分步展示如何使用 Hyperledger Fabric v0.6 来构建、运行和执行使用 Java 语言编写的智能合约或链代码。您将安装一些工具,定义本地区块链网络,构建并运行一个链代码智能合约。 有关区块链的概述,请参阅 developerWorks 博客中的 “...

rejames的博客 3954

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的空间 1144

为什么编译Open JDK还需要旧版本JDK?Swift编译器是什么语言编写?X语言编译器可以用X语言编写吗?GCC是用什么语言编写的?编程语言出现之前,编译器或解释器用什么语言编写?

编译Open JDK需要旧版本JDK是因为JDK本身是用Java编写的,需要旧版JDK来编译。Swift编译器主要用C++和Swift编写。X语言编译器最初不能用X语言编写,需用其他语言编写初始编译器后,才能用X语言编写。编程语言或编译器的自举是指用某种语言编写该语言的编译器。GCC早期用C语言编写,后转向C++。其他编译器/解释器如MSVC、Clang、Java编译器等也经历了类似的发展过程。

编程语言开发、框架原理、编程思想、最佳实践技巧经验分享。致力于各种编程技术的技巧经验干货分享,讲解开发避坑技巧,追踪开发前沿技术,实战展开解决难题。 程序员小迷助您在编程路上越走越好! 1118

.net中如何打日志

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

我翱翔的天空 3212

.net保存数据XML文件中

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

死亡凋零的专栏 1851

.net 2.0下的OOXML神器:NPOI.OpenXml4Net

作者:Tony Qu NPOI官方博客:http://tonyqus.sinaapp.com | 官方QQ群:189925337 可能很多人已经习惯了使用.Net 3.0下的System.IO.Packaging(WindowsBase.dll)来操作Office 2007/2010的文件格式,以至于大家都默许了.net 2.0下无法操作OOXML文件的观点,尽管也...

weixin_33836874的博客 517

java关于继承的代码_Java语言中编写继承代码步骤

对于java语言的学习来说,最终想要检验一下自己的学习成果,检验是否学会了java,检验一个java零基础的新手是否真的入了java大门,最直接的方法就是会不会写代码编程序。在充分学习了有关于java继承的知识后,就要来学习如何编写继承代码了,这篇文章就来介绍一下在java语言中编写继承代码步骤是怎样的,赶紧看下去吧。总的来说,在java语言中编写继承代码步骤可以分成两步:第一步:编写父类[修饰符...

weixin_32204687的博客 2247

java编写html,java编写html代码

java编写html代码[2021-02-08 08:29:14]简介:php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐:《PHP视频教java编写一个注册界面的方法:首先创建一个java项目,并选择文本...

weixin_33933280的博客 1602

Java 编写代码语法

本文主要介绍Java代码编写相关的语法规则,包括执行代码的方法,Java代码的格式命名,和Java基本语法,以及相关示例代码。下面是一个简单的代码,该代码将打印输出Hello World。MyClass.java public class Main {   public static void main(String[] args) {     System.out.println("Hello World");   } } 示例说明

ak478848的博客 2604

如何在手机或平板上编写代码?

支持语言包括 Java, C++, C, C#, JavaScript, CSS, PHP等很多主流开发语言地址 :1. 点击左上角的创建2. 选择对应的开发语音3. 输入文件命名4. 创建运行项目。

私欲日生,如地上尘,一日不扫,便又有一层。着实用功,便见道无终穷,愈探愈深,必使精白无一毫不彻方可。 1万+

java 调c语言代码_java中调用C语言代码

欢迎来到:http://observer.blog.51cto.com第一步:搭建C语言开发环境了。在此,个人使用的linux系统,介绍的linux的安装,windows的朋友可自行上网搜索。linux下内置了编译器gcc,我们要做的只是写好c源文件然后在进行编译就可以了,但是如果没有gcc编译器的话,使用以下命令获取~# sudo apt-get install gcc同时要下载辅助工具~# s...

weixin_30111715的博客 547

如何编写高质量JAVA代码

     如何编写高质量代码,从而提升系统性能。想必是很多程序员都非常注意的地方,最近总结了一些要点,特此记录在案。 所谓代码高可读性和高可维护性,其实就是应该有着规范的Java程序设计风格,在开发程序过程中,从近期目标看是应该着眼于功能实现,但是只能解一时之渴,而不思长远之计,确不可取,一个杂乱无序的代码让人看后有一种不解其意,心绪烦乱的感觉。所以,作为一名合格的

jellins的专栏 4182

编写c语言和Java语言程序:求半径为5的圆的周长是多少?

编写C语言和Java语言程序:求半径为5的圆的周长是多少? C: #include<stdio.h> void main() { double r=5,PI=3.14159,c; c=2*PI*r; printf("The circumference of a circle with radius 5 is %f\n",c); } 结果: Java: package homework; public class Circle{ public static void main(Strin

m0_47004972的博客 3370

app编写需要哪种语言

原生App开发:优选Swift(iOS)和Kotlin(Android)。跨平台App开发:优选Flutter(Dart)和React Native(JavaScript)。游戏App开发:优选Unity(C#)和Unreal Engine(C++)。低代码工具:适合简单、快速的App制作。

fanying_98的博客 2043

如何编写高质量的Java代码

Java代码安全规范 本文目的 故障分析 资源分析 安全条目 QPS CPU Memory 磁盘I/O Network 代码工程 Web安全 附录 Redis网卡打满参照表 参考 本文目的 向Nasa的《NASA的10条代码编写原则》学习,目的有二:一是约束Java代码的使用、规避较高危的代码,二是code review更易识别。有很多优秀的JA...

作一个独立连续的思考者 4511

java代码编写规范文档_java编程规范及代码编写标准.doc

java编程规范及代码编写标准.doc还剩13页未读,继续阅读下载文档到电脑,马上远离加班熬夜!亲,喜欢就下载吧,价低环保!内容要点:文档名称: Java 编程规范及代码编写标准 密级:内部公开2006-06-08 未经许可,不得扩散 14规则 3.对于 if、else、for、while 等语句后的代码,一律用{}括起来,哪怕只有一句。如下面的写法是不对的if(a ==b )i = 10;应写成...

weixin_30301989的博客 540
上一篇: Visual Basic.NET和GDI+共创图标编辑器
下一篇: 利用XSLT把ADO记录集转换成XML
slightboy
博客等级 码龄23年 3粉丝 18原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值