在使用wpf编程过程中,会用到xml的配置文件,实现对其读取和存储的操作是必须的。
1 xml说明
可扩展标记语言 (Extensible Markup Language, XML) ,标准通用标记语言的子集,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 可扩展性良好,内容与形式分离,遵循严格的语法要求,保值性良好等优点 。
特征
XML具有以下特点:
- XML可以从HTML中分离数据。即能够在HTML文件之外将数据存储在XML文档中,这样可以使开发者集中精力使用HTML做好数据的显示和布局,并确保数据改动时不会导致HTML文件也需要改动,从而方便维护页面。XML也能够将数据以“数据岛”的形式存储在HTML页面中,开发者依然可以把精力集中到使用HTML格式化和显示数据上。
- XML可用于交换数据。基于XML可以在不兼容的系统之间交换数据,计算机系统和数据库系统所存储的数据有多种形式,对于开发者来说,最耗时间的工作就是在遍布网络的系统之间交换数据。把数据转换为XML格式存储将大大减少交换数据时的复杂性,还可以使这些数据能被不同的程序读取。
- XML可应用于B2B中。例如在网络中交换金融信息, 目前XML正成为遍布网络的商业系统之间交换信息所使用的主要语言,许多与B2B有关的完全基于XML的应用程序正在开发中。
- 利用XML可以共享数据。XML数据以纯文本格式存储,这使得XML更易读、更便于记录、更便于调试,使不同系统、不同程序之间的数据共享变得更加简单。
- XML可以充分利用数据。XML是与软件、硬件和应用程序无关的,数据可以被更多的用户、设备所利用,而不仅仅限于基于HTML标准的浏览器。其他客户端和应用程序可以把XML文档作为数据源来处理,就像操作数据库一样,XML的数据可以被各种各样的“阅读器”处理。
- XML可以用于创建新的语言。比如,WAP和WML语言都是由XML发展来的。WML(Wireless Markup Language,无线标记语言)是用于标识运行于手持设备上(比如手机)的Internet程序的工具,它就采用了XML的标准。 [4]
总之,XML使用一个简单而又灵活的标准格式,为基于Web的应用提供了一个描述数据和交换数据的有效手段。但是,XML并非是用来取代HTML的。HTML着重如何描述将文件显示在浏览器中,而XML与SGML相近,它着重描述如何将数据以结构化方式表示。
规范
XML文件格式是纯文本格式,在许多方面类似于HTML,XML由XML元素组成,每个XML元素包括一个开始标记( ),一个结束标记( )以及两个标记之间的内容,例如,可以将XML元素标记为价格、订单编号或名称。标记是对文档存储格式和逻辑结构的描述。在形式上,标记中可能包括注释、引用、字符数据段、起始标记、结束标记、空元素、文档类型声明( DTD)和序言。
具体规则如下:
1、必须有声明语句。
XML声明是XML文档的第一句,其格式如下:
1<?xml version="1.0" encoding="utf-8"?>
2、注意大小写在XML文档中,大小写是有区别的。
“A”和“a”是不同的标记。注意在写元素时,前后标记的大小写要保持一致。最好养成一种习惯,或者全部大写,或者全部小写,或者大写第一个字母,这样可以减少因为大小写不匹配而产生的文档错误。
3、XML文档有且只有一个根元素良好格式的XML文档必须有一个根元素,就是紧接着声明后面建立的第一个元素,其他元素都是这个根元素的子元素,根元素完全包括文档中其他所有的元素。根元素的起始标记要放在所有其他元素的起始标记之前;根元素的结束标记要放在所有其他元素的结束标记之后。
4、属性值使用引号在HTML代码里面,属性值可以加引号,也可以不加。但是XML规定,所有属性值必须加引号(可以是单引号,也可以是双引号,建议使用双引号),否则将被视为错误。
5、所有的标记必须有相应的结束标记在HTML中,标记可以不成对出现,而在XML中,所有标记必须成对出现,有一个开始标记,就必须有一个结束标记,否则将被视为错误。
6、所有的空标记也必须被关闭空标记是指标记对之间没有内容的标记,比如“”等标记。在XML中,规定所有的标记必须有结束标记。
示例:
1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="osg.AndroidExample"
4 android:installLocation="preferExternal"
5 android:versionCode="1"
6 android:versionName="1.0">
7 <uses-sdk android:targetSdkVersion="8" android:minSdkVersion="8"></uses-sdk>
8 <uses-feature android:glEsVersion="0x00020000"/> <!-- OpenGL min requierements (2.0) -->
9 <uses-permission android:name="android.permission.INTERNET"/>
10
11 <application android:label="@string/app_name" android:icon="@drawable/osg">
12 <activity android:name=".osgViewer"
13 android:label="@string/app_name" android:screenOrientation="landscape"> <!-- Force screen to landscape -->
14 <intent-filter>
15 <action android:name="android.intent.action.MAIN" />
16 <category android:name="android.intent.category.LAUNCHER" />
17 </intent-filter>
18 </activity>
19
20 </application>
21</manifest>
XML与HTML区别
(1)可扩展性方面:HTML不允许用户自行定义自己的标识或属性,而在XML中,用户能够根据需要自行定义新的标识及属性名,以便更好地从语义上修饰数据。
(2)结构性方面:HTML不支持深层的结构描述,XML的文件结构嵌套可以复杂到任意程度,能表示面向对象的等级层次。
(3)可校验性方面:HTML没有提供规范文件以支持应用软件对HTML文件进行结构校验,而XML文件可以包括一个语法描述,使应用程序可以对此文件进行结构校验。
(4)可以通过将html文件转换为符合xml标准的xhtml文件,实现html标准和xml标准的结合。
用途
XML 应用于 web 开发的许多方面,常用于简化数据的存储和共享。
XML 把数据从 HTML 分离
如果你需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编辑 HTML。
通过 XML,数据能够存储在独立的 XML 文件中。这样你就可以专注于使用 HTML 进行布局和显示,并确保修改底层数据不再需要对 HTML 进行任何的改变。
通过使用几行 JavaScript,你就可以读取一个外部 XML 文件,然后更新 HTML 中的数据内容。
提示:您将在稍后的章节学习更多这方面的内容。
XML 简化数据共享
在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。
XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。
这让创建不同应用程序可以共享的数据变得更加容易。
XML 简化数据传输
通过 XML,可以在不兼容的系统之间轻松地交换数据。
对开发人员来说,其中一项最费时的挑战一直是在因特网上的不兼容系统之间交换数据。
由于可以通过各种不兼容的应用程序来读取数据,以 XML 交换数据降低了这种复杂性。
XML 简化平台的变更
升级到新的系统(硬件或软件平台),总是非常费时的。必须转换大量的数据,不兼容的数据经常会丢失。
XML 数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的操作系统、新应用程序或新的浏览器。
XML 使您的数据更有用
由于 XML 独立于硬件、软件以及应用程序,XML 使您的数据更可用,也更有用。
不同的应用程序都能够访问您的数据,不仅仅在 HTML 页中,也可以从 XML 数据源中进行访问。
通过 XML,您的数据可供各种阅读设备使用(手持的计算机、语音设备、新闻阅读器等),还可以供盲人或其他残障人士使用。
XML 用于创建新的 Internet 语言
很多新的 Internet 语言是通过 XML 创建的:
其中的例子包括:
XHTML - 最新的 HTML 版本
WSDL - 用于描述可用的 web service
WAP 和 WML - 用于手持设备的标记语言
RSS - 用于 RSS feed 的语言
RDF 和 OWL - 用于描述资源和本体
SMIL - 用于描述针针对 web 的多媒体
2 示例
在WPF(Windows Presentation Foundation)中,你可以使用System.Xml命名空间下的类来读取和写入XML文件。以下是一个简单的示例,展示了如何在WPF应用程序中读取和写入XML文件。
步骤1:创建XML文件
首先,创建一个XML文件(例如data.xml),内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<Users>
<User>
<Id>1</Id>
<Name>John Doe</Name>
<Age>30</Age>
</User>
<User>
<Id>2</Id>
<Name>Jane Smith</Name>
<Age>25</Age>
</User>
</Users>
步骤2:创建WPF项目并添加代码
创建一个新的WPF项目。
在项目中添加一个按钮和两个文本框(或其他UI元素)来显示和输入数据。
在后台代码(例如MainWindow.xaml.cs)中编写读取和写入XML文件的代码。
以下是示例代码:
MainWindow.xaml
<Window x:Class="XmlExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="XML Example" Height="200" Width="400">
<Grid>
<StackPanel>
<Button Name="LoadButton" Content="Load Data" Click="LoadButton_Click" Margin="10"/>
<Button Name="SaveButton" Content="Save Data" Click="SaveButton_Click" Margin="10"/>
<TextBox Name="IdTextBox" Width="100" Margin="10"/>
<TextBox Name="NameTextBox" Width="200" Margin="10"/>
<TextBox Name="AgeTextBox" Width="100" Margin="10"/>
</StackPanel>
</Grid>
</Window>
MainWindow.xaml.cs
using System;
using System.Linq;
using System.Windows;
using System.Xml.Linq;
namespace XmlExample
{
public partial class MainWindow : Window
{
private const string XmlFilePath = "data.xml";
public MainWindow()
{
InitializeComponent();
}
private void LoadButton_Click(object sender, RoutedEventArgs e)
{
try
{
XDocument xmlDoc = XDocument.Load(XmlFilePath);
var user = xmlDoc.Descendants("User").FirstOrDefault();
if (user != null)
{
IdTextBox.Text = user.Element("Id")?.Value;
NameTextBox.Text = user.Element("Name")?.Value;
AgeTextBox.Text = user.Element("Age")?.Value;
}
}
catch (Exception ex)
{
MessageBox.Show("Error loading XML: " + ex.Message);
}
}
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
try
{
XDocument xmlDoc = XDocument.Load(XmlFilePath);
var users = xmlDoc.Descendants("Users").First();
// Assuming we want to update the first User element
var user = users.Elements("User").FirstOrDefault();
if (user != null)
{
user.Element("Id")?.SetValue(IdTextBox.Text);
user.Element("Name")?.SetValue(NameTextBox.Text);
user.Element("Age")?.SetValue(AgeTextBox.Text);
}
else
{
// Alternatively, we can add a new User element
users.Add(new XElement("User",
new XElement("Id", IdTextBox.Text),
new XElement("Name", NameTextBox.Text),
new XElement("Age", AgeTextBox.Text)
));
}
xmlDoc.Save(XmlFilePath);
MessageBox.Show("Data saved successfully!");
}
catch (Exception ex)
{
MessageBox.Show("Error saving XML: " + ex.Message);
}
}
}
}
注意事项:
- 文件路径:确保XmlFilePath指向正确的XML文件路径。
- 错误处理:示例代码包含基本的错误处理,但在实际应用中,你可能需要更详细的错误处理逻辑。
- 数据更新:在SaveButton_Click方法中,示例代码更新了第一个User元素的数据。如果你想要添加新数据或更新特定用户的数据,你需要相应地修改逻辑。
- XML结构:确保XML文件的结构与代码中使用的XPath查询相匹配。
这个示例展示了基本的XML读写操作,但在实际应用中,你可能需要处理更复杂的XML结构和数据验证。