一、从DataSet返回XML数据

将DataSet写入文件

DataSet本身是在内存中保存数据的一个临时存储的一个区域

DataSet.WriteXml() // 将DataSet数据写到磁盘上面(持久化)

XmlWriteMode

  –WriteSchema:以XML数据形式写入DataSet的当前内容,以关系结构作为内联XSD架构。如果DataSet只有架构而无数据,那么只写入内联结构。如果DataSet没有当前架构,则不写入任何内容。  (必须要有架构,将架构XSD保存到XML文件中)

  –IgnoreSchema:以XML数据形式写入DataSet的当前内容,不带XSD架构。如果无数据加载到DataSet中,则不写入任何内容。(只写数据不写架构)

  –DiffGram:作为DiffGram写入整个DataSet,包括原始值和当前值。诺要生成只包含已更改的值的DiffGram,请调用GetChanges,然后在返回的DataSet上作为DiffGram调用WriteXml。

 

从XML文件读取到DataSet中

DataSet.ReadXml() //将xml文件读入到DataSet中

XmlReadMode

  –Auto:默认值

  –ReadShema:读取任何内联架构并加载数据。如果DataSet已经包含架构,则可以将新表添加到架构中,但是如果内联架构中的任何表在DataSet中已经存在,则会引发异常。(必须包含内联架构)

  –IgnoreSchema:忽略任何内联架构并将数据读入现有的DataSet架构。如果任何数据与现有的架构不匹配,就会将这些数据丢弃(包括为DataSet定义的不同命名空间中的数据)。如果数据是DiffGram,IgnoreSchmea与DiffGram具有相同的功能。

  –DiffGram:读取DiffGram,将DiffGram中的更改应用到DataSet。语义与Merge操作的语义相同。与Merge操作一样,保留RowState值。向ReadXml的DiffGram输入只能使用WriteXml中的DiffGram输出来获得。

  –InferSchema:忽略任何内联架构,从数据推断出架构并加载数据。如果DataSet已经包含架构,就通过添加新表或者向现有的表添加列,来扩展当前架构。如果推断的表已经存在但是具有不同的命名空间,或者如果推断的列中有一些与现有的列冲突,则会引发异常。

  –Fragment:针对SQL Server的实例读取XML片段(例如,通过执行FORXML查询生成的XML片段)。当XmlReadMode设置为Fragment时,默认命名空间作为内联架构来读取。

  –InferTypedSchema:忽略任何内联架构,从数据推断出强类型架构并加载数据。如果无法从数据推断类型,则会将其解释为字符串数据。如果DataSet已经包含架构,则通过添加新表或者通过向现有的表中添加列来扩展当前架构。如果推断的表已经存在但是具有不同的命名空间,或者如果推断的列中有一些与现有的列冲突,则会引发异常。

 

获取XML结果

DataSet.GetXml() //只获取数据没有架构

调用此方法与调用WriteXml并将XmlWriteMode设置为IgnoreSchema相同。

GetXml以字符串的形式返回XML,因此,与将XML写入文件的WriteXml相比,他需要更多的系统开销。(效率相对低)

如果使用架构推理生成DataSet并使用XML或Web服务对它进行序列化,则列的排序方式可能会改变。

 

Demo:

        DataSet ds = new DataSet("Authors");        
        private void loadDataToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection("server=(local);integrated security=true; database=pubs;");
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandText = "select * from authors";
            SqlDataAdapter adapter = new SqlDataAdapter(cmd);           
            adapter.Fill(ds,"Author");
            this.dataGridView1.DataSource = ds.Tables["Author"];      
        }

        private void readXmlToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog open = new OpenFileDialog();
            if (DialogResult.OK == open.ShowDialog())
            {
                string fileName = open.FileName;
                ds.ReadXml(fileName, XmlReadMode.ReadSchema);
                this.dataGridView1.DataSource = ds.Tables["Author"];
            }
        }

        private void saveXmlToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SaveFileDialog save = new SaveFileDialog();
            if (DialogResult.OK == save.ShowDialog())
            {
                string fileName = save.FileName;
                ds.WriteXml(fileName, XmlWriteMode.WriteSchema);              
            }
        }

        private void getXmlToolStripMenuItem_Click(object sender, EventArgs e)
        {         
            MessageBox.Show (ds.GetXml());
        }

 

二、从SQL Server返回XML数据

SQL Server中的FOR XML语句

扩展SELECT 语法

返回XML,代替了行和列

可配置用于返回属性,元素和架构

使用XML客户端应用程序会受益

 

在SQL Server 2005里面有四种FOR XML的格式,这四种都是用来定义的返回的XML的格式

什么是RAW模式查询?

XML行集模式的代表

• 包含元素或者属性

• 可选的根元素和行元素的名称

 

 

eg:

select * from authors
for xml raw('Author'), ELEMENTS,root('Authors');//元素的形式

<Authors>
  <Author>
    <au_id>172-32-1176</au_id>
    <au_lname>White</au_lname>
    <au_fname>Johnson1</au_fname>
    <phone>408 496-7223</phone>
    <address>10932 Bigge Rd.</address>
    <city>Menlo Park</city>
    <state>CA</state>
    <zip>94025</zip>
    <contract>1</contract>
  </Author>

</Authors>

 

eg:

select * from authors
for xml raw('Author'), root('Authors');//属性的形式

<Authors>
  <Author au_id="172-32-1176" au_lname="White" au_fname="Johnson1" phone="408 496-7223" address="10932 Bigge Rd." city="Menlo Park" state="CA" zip="94025" contract="1" />

</Authors>

 

eg: 利用Join语句从多个表中获取数据

select a.OrderID,a.CustomerID ,a.EmployeeID , b.CompanyName,b.ContactName,b.Phone,b.Country,
b.CreationDate from Orders as a JOIN
dbo.Customers as b on a.CustomerID = b.CustomerID
for xml raw('Order'),elements, root('Orders');

 

什么是AUTO模式查询?

数据实体的XML表示

基于连接优先的嵌套数据

可以使用例如ELEMENTS和ROOT的选项


这种方式和Row方式一样,均不能指定元素的放置位置。
eg:

select Cust.CustomerID ,Cust.CompanyName ,cust.Phone ,[Order].OrderID
from Customers Cust JOIN Orders [Order]
on Cust.CustomerID = [Order].CustomerID
for xml AUTO,Root('Custs');

 

<Custs>
  <Cust CustomerID="ALFKI" CompanyName="Alfreds Futterkiste" Phone="030-0074321">(左表)
    <Order OrderID="10643" />
    <Order OrderID="10692" />
    <Order OrderID="10702" />
    <Order OrderID="10835" />
    <Order OrderID="10952" />
    <Order OrderID="11011" />
  </Cust>

</Custs>

 

什么是EXPLICIT模式查询?

XML文档的表格形式表示

允许XML格式的完全控制

 

什么是PATH模式查询?

使用XPath来指定XML格式

允许嵌套数据的创建

比使用EXPLICIT模式更加容易

 

eg:

select EmployeeID "@EmployeeID",
FirstName "EmpName/First",
LastName  "EmpName/Last"
from
Employees
for xml path ('Employee'),root('Employees') ;

 

<Employees>
  <Employee EmployeeID="1">
    <EmpName>
      <First>Nancy</First>
      <Last>Davolio</Last>
    </EmpName>
  </Employee>

</Employees>

 

三、用XmlReader读取XML

XmlReader

• 提供对XML数据进行快速、非缓存、只进访问的读取器。

 

创建XML读取器

使用Create方法和XmlReaderSettings类:

      –可以指定要在所创建的XmlReader对象上支持的功能。

      –XmlReaderSettings类可以重复使用,以创建多个读取器对象。

      –可以将功能添加到现有读取器中

      –可以充分利用.NET Framework 2.0版本的XmlReader类中增加的所有新功能。某些功能只能在通过Create方法创建的XmlReader对象上使用,例如更好的一致性检查以及与XML 1.0建议的一致性。

 

使用XmlReader访问外部资源

定位并打开XML实例文档。

定位并打开XML实例文档所引用的任何外部资源。其中可以包括实体、文档类型定义、架构等。

如果资源存储在要求身份验证的系统上,XmlResolver.Credentials属性可以用于指定必要的凭据。

 

数据验证 

• XmlSchemaSet

– 将架构缓存在内存中,而不是从文件或URL访问架构,从而提高性能。

 XmlSchemaSet中的每个架构通过命名空间URI和架构位置来标识,命名空间URI和架构位置在架构添加到XmlSchemaSet时指定。

 Schemas 属性分配要使用的XmlSchemaSet对象。

• XmlReader

 可以根据内联XML架构定于语言(XSD)架构验证XML文件。

 在创建XmlReader之前,将XmlReaderSettings.ValidationFlags属性更改为启用ProcessInlineSchema选项。

 

 //从本地文件读取

  private void readFromFileToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog open = new OpenFileDialog();
            if (DialogResult.OK == open.ShowDialog())
            {
                string fileName = open.FileName;
                XmlReaderSettings settings = new XmlReaderSettings();
                settings.ConformanceLevel = ConformanceLevel.Document;
                settings.IgnoreWhitespace = true;
                settings.IgnoreComments = true;
                XmlReader reader = XmlReader.Create(fileName, settings);

                reader.Read();
                reader.Read();
                reader.Read();
                MessageBox.Show(reader.ReadInnerXml());
                reader.Close();

            }
        }

//从数据库读取

        private void readFromDatabaseToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection("server=(local);integrated security=true; database=pubs;");
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandText = "select * from authors for xml raw('Author'),elements, root('Authors');";
            cmd.CommandType = System.Data.CommandType.Text;
            con.Open();
            XmlReader reader = cmd.ExecuteXmlReader();
            reader.Read();
            MessageBox.Show(reader.ReadOuterXml());
            reader.Close();
            con.Close();
        }

 

四、使用DOM模型处理XML数据

XML文档对象模型(DOM)

XML文档对象模型(DOM)类是XML文档的内存中表示形式

DOM使您能够以编程方式读取、处理和修改XML文档

XML数据在内存中表示是常见的结构化方法,尽管实际的XML数据在文件中时或从另一个对象转入时以线性方式存储。

主要类:

      – XmlDocument

        – XmlNode


执行DOM查询

• XmlNode方法

 – SelectNodes()

 – SelectSingleNode()

• XmlDocument方法

 – GetElementsByTagName()

 – GetElementById()

 

XmlNode.SelectNodes()方法

• 最简单的Dom查询方法

• 输入XPath表达式

• 返回XmlNodeList

 使用迭代进行查询

XmlDocument doc = new XmlDocument();

doc.Load("C:\\demos\\MusicBase.xml");

XmlNodeList nodes = doc.SelectNodes("descendant::Track[@number=2]/text()");

foreach(XmlNode node in nodes){

  Console.WriteLine(node.Value); 

 

XmlNode.SelectSingleNode()方法

• 获取单个节点

• 将返回结果集中的第一个节点

– 有可能会返回大量结果集

– 可能会造成性能降低

• 要提高性能

– 构造XPath,只返回一个节点 

 

 

  private void xmlDocumentToolStripMenuItem_Click(object sender, EventArgs e)
        {
                XmlDocument doc = new XmlDocument();
                doc.Load(@"d:\author.xml");
                XmlNode node = doc.DocumentElement;
                //foreach (XmlNode xmlnode in node.ChildNodes)
                //{
                //    MessageBox.Show(xmlnode.ChildNodes[0].Name + ":" + xmlnode.ChildNodes[0].InnerText);
                //}  

                //xPath表达式
                foreach (XmlNode xmlnode in doc.SelectNodes("/NewDataSet/Author/au_lname[../state='CA']"))
                {
                    MessageBox.Show(xmlnode.Name + ":" + xmlnode.InnerText);
                }
          
        }

五、使用XPath数据模型处理XML数据

详解.NET XPath处理引擎

Dom

     重量级读写

     • 随机访问

     • 易于访问复杂对象模型

XmlReader

     • 轻量级访问

     • 只读

     • 只想前

     • 访问快速

 

创建XPathNavigator对象

• 下面的类都实现了System.Xml.XPath命名空间的IXPathNavigable接口,都可以使用CreateNavigator方法返回XPathNavigator对象

- XPathDocument

- XmlDocument

- XmlNode

• 使用XPathNavigator对象可以选择、计算、浏览和(在有些情况下)编辑基础XML数据。

 

选择、计算和匹配XML数据

• 选择节点

- Select()

- SelectSingleNode()

• 计算XPath表达式

- Evaluate()

• 匹配节点与XPath表达式

- Matches()

 

访问XML数据

• OuterXml属性

用于获取整个XML文档的标记或只获取单个节点及其子节点的标记。

• ReadSubtree()方法

用于将XML文档的全部内容或只是单个节点及其子节点流处理到XmlReader对象。

 

编辑XML数据

插入节点

- InsertAfter、InsertBefore、InsertElementAfter、InsertElementBefore

- AppendChild、PrependChild、AppendChildElement、PrependChildElement

- CreateAttribute、CreateAttributes

修改节点

- SetValue、SetTypedValue

删除节点

- DeleteSelf

eg:

       private void getXmlToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(@"d:\author.xml");
            XPathNavigator nav = doc.CreateNavigator();
            MessageBox.Show(nav.OuterXml);
        }

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2011-07-28 14:55  tonylx  阅读(517)  评论(0)    收藏  举报