xml使用——采摘网上资料,个人学习用

//近期学习中,不断补充
1、xml概念:
1)Extensible Markup Language,Xml被设计用来传输和存储数据;超文本标记语言(HyperText Markup Language,HTML)被设计用来显示数据。它们都是标准通用标记语言的子集。
XML是一种很像HTML的标记语言。
它的设计宗旨是传输数据,而不是显示数据。
它的标签没有被预定义。您需要自行定义标签。
它被设计为具有自我描述性。
它是W3C的推荐标准。
2)XML和HTML之间的差异
它不是HTML的替代。它是对超文本标记语言的补充。
它和HTML为不同的目的而设计:
XMl被设计用来传输和存储数据,其焦点是数据的内容。
HTML被设计用来显示数据,其焦点是数据的外观。
HTML旨在显示信息,而它旨在传输信息。
对它最好的描述是:它是独立于软件和硬件的信息传输工具。

可以查看百度百科上的介绍,如下:

它与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,它仅仅是存储数据。事实上它与其他数据表现形式最大的不同是:它极其简单,这是一个看上去有点琐细的优点,但正是这点使它与众不同。
它和超文本标记语言语法区别:超文本标记语言的标记不是所有的都需要成对出现,它则要求所有的标记必须成对出现;HTML标记不区分大小写,它则大小敏感,即区分大小写。

标准通用标记语言、超文本标记语言是它的先驱。标准通用标记语言它是国际上定义电子文件结构和内容描述的标准,是一种非常复杂的文档的结构,主要用于大量高度结构化数据的防卫区和其他各种工业领域,利于分类和索引。同它相比,定义的功能很强大,缺点是它不适用于Web数据描述,而且标准通用标记语言软件价格非常昂贵。 HTML相信大家都比较熟悉,即超文本标识语言,它的优点是比较适合web页面的开发。但它有一个缺点是标记相对少,只有固定的标记集如<p>.<strong>等。缺少标准通用标记语言的柔性和适应性。不能支持特定领域的标记语言,如对数学、化学、音乐等领域的表示支持较少。举个例子来说,开发者很难在网页上表示数学公式、化学分子式和乐谱。它结合了标准通用标记语言和HTML的优点并消除其缺点。XML仍然被认为是一种标准通用标记语言。比标准通用标记语言要简单,但能实现标准通用标记语言的大部分的功能。1996年的夏天,标准通用标记语言,使其在Web中,既能利用标准通用标记语言的长处,又保留html的简单性。
XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其它的数据交换格式,但不久之后他们都将支持XML,那就意味着程序可以更容易的与Windows, Mac OS, Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析它,并以XML格式输出结果。

为了使得标准通用标记语言显得用户友好,它重新定义了标准通用标记语言的一些内部值和参数,去掉了大量的很少用到的功能,这些繁杂的功能使得标准通用标记语言在设计网站时显得复杂化。它保留了标准通用标记语言的结构化功能,这样就使得网站设计者可以定义自己的文档类型,它同时也推出一种新型文档类型,使得开发者也可以不必定义文档类型。


2、XML的读取
1)采用 XmlDocument 读取数据
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);
XmlElement rootElement =xmlDoc.DocumentElement;
XmlNodeList xmlNodes = rootElement.ChildNodes;
 foreach (XmlNode xmlNode in xmlNodes)
{
foreach (XmlNode item in xmlNode.ChildNodes)
{
string name = item.Name;
double value = Convert.ToDouble(item.InnerText);
}
}
(2)查询节点是否具有某个属性
if(XmlNode.Attributes["attr"] == null)
{MessageBox.Show("!");}
(3)查询是否具有某个节点
<UserList>  
</User>
 ...
</User>
</UserList>
查询如下:
XmlDocument doc = new XmlDocument();
doc.Load("filePath");
XmlNode node = doc.DocumentElement.SelectSingleNode(@"./UserList/User");
XmlNode node = doc.DocumentElement.SelectNodes(@"./UserList/User");//括号内即"//findNodeString"
if (node != null)//存在
{
}
3、XML的写入
1)采用 XmlDocument 写入数据。


例子如下。 
//选中的XML表名称
string theSaveXml = null;
if (treeView1.SelectedNode != null)
{
 theSaveXml = treeView1.SelectedNode.Text;
}
else
{        
theSaveXml = treeView1.Nodes[0].Text;
}


//XML表的路径
string theSavePath = ...;
//得到节点名称
string theNodeName = GetRootNodeName(theSavePath);


//写入Xml
XmlDocument xmlDoc = new XmlDocument();


//Create the xml declaration first
XmlNode theDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", "");
xmlDoc.AppendChild(theDeclaration);


//Create the root node
string theRootElementName =...;
var theRootElement = xmlDoc.CreateElement(theRootElementName);


//Set attributes for the root node
theRootElement.SetAttribute("name", theSaveXml);


//append into xmlDoc
xmlDoc.AppendChild(theRootElement);


//create the nodes 
XmlElement theElement=xmlDoc.CreateElement(theNodeName);
theChildrenElement = xmlDoc.CreateElement(theChildrenElementNames);                    theChildrenElement.InnerText = ..;
theElement.AppendChild(theChildrenElement);


//append into theRootElement  
theRootElement.AppendChild(theElement);


//save the xml 
xmlDoc.Save(theSavePath);


4、XML删除
string XmlPath = @"...\...\xxx.xml";
//判断文件是否存在
if(File.Exists(XmlPath))
{
    File.Delete(XmlPath);
}

5.SelectNodes使用

转载至:http://blog.csdn.net/eric_guodongliang/article/details/7187880/

SelectNodes("item")从当前节点的儿子节点中选择名称为 item 的节点。
SelectNodes("/item")从根节点的儿子节点中选择名称为 item 的节点。
SelectNodes("//item")从任意位置的节点上选择名称为 item 的节点。要重点突出这个任意位置,它不受当前节点的影响,也就是说假如当前节点是在第 100 层(有点夸张),也可以选择第一层的名称为 item 的节点。
SelectNodes(".")选择当前节点。
SelectNodes("..")选择当前节点的父节点。
SelectNodes("//item[@name]")在 SelectNodes("//item") 的基础上,增加了一个限制,就是要求拥有 name 属性。
SelectNodes("//item[@name='111']")

在 SelectNodes("//item[@name]") 的基础上,增加了一个限制,就是要求 name 属性值为 111。注意语法中有引号;如果没有引号,则表示是数字类型,对于数字类型可以使用大于号、小于号等,比如:SelectNodes("//item[@v>333]")。

SelectNodes("//item[1]")选择第一个 item,注意是第一个,不是第二个。
还有这里是指亲兄弟间的第一个 item,也就是说:父级若有三个 item,则选择第一个;若父级第二个 item 的有两个名称同样为 item 的儿子,则第一个儿子会被选择出来;若父级第三个 item 的也有两个名称同样为 item 的儿子,则第一个儿子也会被选择出来……
SelectNodes("//item[last()-1]")倒数第二个节点,同样是指亲兄弟间的倒数第二个。
SelectNodes("//item[position()<=2]")位置为第一和第二的节点(第一个节点的 position() 为 1),同样是指亲兄弟间的位置。
SelectNodes("//@name")
SelectNodes("/root/item/@name") 取 item 的 name 属性
选择 name 属性,注意这下选择的是属性,而不是节点了。用 Value 属性获取属性集合的属性值。
SelectNodes("/root/item")根节点 root 下的 item 儿子节点。
SelectNodes("/root//item")根节点 root 下的不管是儿子、孙子、重孙子……,只要是名称为 item 的统统选取出来。

通配符
可用 * 表示任意节点名称,比如 SelectNodes("/channel/*/item");
用 @* 表示任意属性;
用 node() 表示任意类型的节点;
用 text() 表示文本类型的节点,实际上也就是表示取文本节点(元素节点下面是文本节点,文本节点下面才是文字)。
运算符
| 表示或。SelectNodes("//item|//channel"),选择 item 或 channel 节点。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值