Dom访问Xml笔记
一.Xml文件格式.
二.概述.
三.几种操作.
3.1添加...
3.2 修改...
3.3 删除...
3.4 复制到另一xml
3.5 除全部...
四.补充.
五.Xpath语法.
5.1 比较常见的...
5.1.1 选择所有的该类元素...
5.1.2 有条件的选择元素...
5.1.3 选择包含有某属性的元素...
5.1.4 选择包含有属性的元素...
5.1.5 选择属性值为**的元素...
5.2 以下是我从网上摘抄下来的。...
5.2.1 文档一...
5.2.2 文档二...
Dom访问Xml笔记
在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型。下面是我的学习笔记,主要是学习怎样用Dom访问Xml。
一.Xml文件格式
以下是用到的xml文件,名为contack.xml(其实是写错了,是contact.xml)
<?xml version="1.0" encoding="utf-8"?>
<xmltt>
<ContactDetails>
<Contact>
<Name>
<First>luo</First>
<Last>luo</Last>
</Name>
<Note>luoandluo</Note>
</Contact>
</ContactDetails>
</xmltt>
二.概述
DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询,但是,DOM的缺点在于它需要一次性的加载整个文档到内存中,对于大型的文档,这会造成资源问题。流模型很好的解决了这个问题,因为它对XML文件的访问采用的是流的概念,也就是说,任何时候在内存中只有当前节点,但它也有它的不足,它是只读的,仅向前的,不能在文档中执行向后导航操作。(不好意思,都是抄的:),说理解吗,也是有的。
三.几种操作
3.1添加
string strXmlPath;
strXmlPath = Server.MapPath("Contack.xml");
XmlDocument xDoc = new XmlDocument();
xDoc.Load(strXmlPath);
XmlElement xEle = null;
//首先查找是否已经存在要添加
xEle = (XmlElement)xDoc.SelectSingleNode(string.Format("//Name[First='{0}' and Last='{1}']",FirstName.Text,LastName.Text));
if (xEle!=null) //已经存在
{
Label3.Text = "already exist";
}
else //不存在,可以添加
{
XmlDocumentFragment xDocFrag = xDoc.CreateDocumentFragment();
XmlElement xContact = xDoc.CreateElement("Contact");
XmlElement xName = xDoc.CreateElement("Name");
XmlElement xFirst = xDoc.CreateElement("First");
xFirst.InnerText = FirstName.Text;
XmlElement xLast = xDoc.CreateElement("Last");
xLast.InnerText = LastName.Text;
xName.AppendChild(xFirst);
xName.AppendChild(xLast);
XmlElement xNote = xDoc.CreateElement("Note");
xNote.InnerText = FirstName.Text+"and"+LastName.Text;
xContact.AppendChild(xName);
xContact.AppendChild(xNote);
xDocFrag.AppendChild(xContact);
XmlNode xRoot = null;
xRoot = xDoc.SelectSingleNode("//ContactDetails"); //ContactDetails
if (xRoot!=null)
{
//xRoot.AppendChild(xDocFrag.FirstChild);// 加在最后
xRoot.PrependChild(xDocFrag.FirstChild); //加在最前,做为第一个子节点
//还有InsertBefore,InsertAfter(new,old)
xDoc.Save(strXmlPath);
Label3.Text = "add sucess"; //
}
else
{
Label3.Text = "add failed";
}
3.2 修改
string str = Server.MapPath("Contack.xml");
XmlDocument xDoc = new XmlDocument();
xDoc.Load(str);
XmlElement xEle = null;
//查看要修改的元素是否存在
xEle = (XmlElement)xDoc.SelectSingleNode(string.Format("//Name[First='{0}' and Last='{1}']",FirstName.Text,LastName.Text));
if (xEle==null) //不存在
{
Label5.Text = "no exist";
}
else //存在
{
//下面是一种方法
/*xEle.ChildNodes[0].InnerXml = FirstName.Text + "Replace";
xEle.ChildNodes[1].InnerXml = LastName.Text + "Replace";
xEle.NextSibling.InnerXml = FirstName.Text + "and" + LastName.Text + "Replace";*/
//也可以这样
//true表示递归地克隆指定节点下的子树
XmlElement xNodeCopy = (XmlElement)xEle.CloneNode(true);//
xNodeCopy.ChildNodes[0].InnerXml = FirstName.Text + "Replace";
xNodeCopy.ChildNodes[1].InnerXml = LastName.Text + "Replace";
//xNodeCopy.NextSibling.InnerXml = FirstName.Text + "and" + LastName.Text + "Replace";
//xNodeCopy.ParentNode.ReplaceChild(xNodeCopy,xEle); //这样是错误的,因为xNodeCopy只是clone了这个点及子点,并没有父点
xEle.ParentNode.ReplaceChild(xNodeCopy,xEle);
}
xDoc.Save(str);
}
3.3 删除
string str;
str = Server.MapPath("Contack.xml");