一、从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);
}
浙公网安备 33010602011771号