最近项目涉及到Xml文件的读取,所有查找了一些xml文件的读取编辑方式,总结如下:
XML文件读取方法:
<1>.XmlDocument 方式:需要将整个Xml文件加载到内存中
<2>.XmlTextReader 方式:不需要将整个Xml文件加载到内存,但是只能向下读取(大型xml文件适用)<3>.Linq to Xml 方式:配合linq查询语法容易理解
[1]使用XMLDocument
[1.1]读取所有数据
XmlDocument xmldoc=new XmlDocument();//创建XMLDocument对象
XmlReaderSettings settings=new XmlReaderSettings();
settings.IgnoreComments=true;//忽视注释
XmlReader reader=XmlReader.Create(@"",settings);
xmldoc.Load(reader);//加载Xml文件
XmlNode node=xmldoc.SelectSingleNode("bookstore");//得到根节点
XmlNodeList nodec=node.ChlidNodes;//得到bookstroe节点下的所有子节点
for(XmlNode node in nodec){
XmlElement xenode=(XmlElement)node;//将节点转化为元素,以便得到节点属性
var s=xenode.GetAttribute("ISBN").ToString();/得到指定名称的属性值
XmlNodeList nodecc=xemodel.ChildNodes;
nodecc.Item(index).innerText;//得到当前节点的下标为index的子节点的值
}
reader.Close();//最后读取完毕,关掉reader
[1.2]添加节点
1.xmlDocument加载xml文件
2.selectSingleNode获取节点
3.CreateElement 创建元素(节点)
4.Appendhild 添加节点
5.SetAttributeNode 设置节点属性
XmlDocument xmldoc=new XmlDocument();
doc.Load(@"..\..\..\**.xml");
XmlNode root=xmldoc.SelectSingNode("bookstore");//找到跟节点
XmlElement node=xmldoc.CreateElement("book");//创建新元素node [book为元素名称: ]
XmlAttribute nodeAttr=xmldoc.CreateAttribute("Type");//创建元素属性对象
nodeAttr.InnerText="ssss";//设置元素属性值
node.SetAttributeNOde(nodeAttr);//将属性设置为新元素book的属性
XmlElement nodec=xmldoc.CreateElement("author");//创建新元素nodec [author元素名称:dddd ]
nodec.InnerText="dddd";//设置元素文本内容
node.AppendChild(nodec);//将nodec子元素添加到node内 [ dddd ]
root.AppendChild(node);//最后将新元素添加到跟节点中
xmldoc.Save(@"..\..\..\**.xml");//保存文件到指定路径
[1.3]清除所有数据
XmlDocument xmldoc=new XMLDocument();
xmldoc.load("");
SelectSingleNode可以传入一个Xpath表 来找到节点
XmlElement xe=xmldoc.DocumentElement; //DocumentElement获取xml文档对象的根XmlElement
string strPath = string.Format("/bookstore/book[@ISBN=\"{0}\"]", dgvBookInfo.CurrentRow.Cells[1].Value.ToString());
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);
selectXe.ParentNode.RemoveChild(selectXe);
XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement.
string strPath = string.Format("/bookstore/book[@ISBN=\"{0}\"]", dgvBookInfo.CurrentRow.Cells[1].Value.ToString());
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath); //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
selectXe.SetAttribute("Type", dgvBookInfo.CurrentRow.Cells[0].Value.ToString());//也可以通过SetAttribute来增加一个属性
selectXe.GetElementsByTagName("title").Item(0).InnerText = dgvBookInfo.CurrentRow.Cells[2].Value.ToString();
selectXe.GetElementsByTagName("author").Item(0).InnerText = dgvBookInfo.CurrentRow.Cells[3].Value.ToString();
xmlDoc.Save(@"..\..\Book.xml");
[2]XmlTextReader XmlTextWriter [流形式]
XmlTextReader reader=new XmlTextReader(path);//path为xml文件路径
while(reader.Read()){
if(reader.NodeType==XmlNodeType.Element){
switch(reader.Name){
case "book":
reader.GetAttribute(0);//获取节点指定索引的属性值
reader.GetAttribute(1);
case "title":
reader.ReadElementString().Trim();
case "author":
reader.ReadeElementString().Trim();
}
}
if(reader.NodeType==XmlNodeType==EndElement){
booklist.Add(model);
model=new Book();
}
}
bookList.RemoveAt(modelList.Count-1);
补充:上述读取属性值,需事先知道节点有几个属性值
if(reader.Name=="book"){
for(int i=0;i
[2.2]XmlTextWriter 写xml文件时默认覆盖原文件,如果原文件不存在则创建新文件
XmlTextWriter xmlWriter = new XmlTextWriter(@"..\..\Book1.xml", null);
xmlWriter.Formatting=Formatting.Indented;//使用 Formatting 属性指定 XML 设定为何种格式。子元素就可以通过使用 Indentation 和 IndentChar 属性来缩进。
xmlWriter.WriteStartDocument(flase);
xmlWriter.WriteStartElement("bookstore");//创建跟节点
xmlWriter.WriteComment("图书信息");//创建注释
xmlWriter.WriteStartElement("book");//创建图书节点
xmlWriter.WriteAttributeString("Type", "选修课");//创建设置属性值
xmlWriter.WriteAttributeString("ID", "111111111");
xmlWriter.WriteElementString("author","卡耐基");//创建单个节点
xml.Writer.WriteElementString("title", "人性的弱点");
xml.Writer.WriteElementString("price", "56.00");
xmlWriter.WriteEndElement();//图书节点创建完成
xmlWriter.WriteEndElement();//根节点创建完成
xmlWriter.Flush();
xmlWriter.Close();
[3] Linq 查询读取 Xml文件 [3.1] 读取所有数据
XElement xe = XElement.Load(@"..\..\Book.xml");
IEnumerable elements = from ele in xe.Elements("book") select ele;//查询出所有标签名book的元素
foreach (var node in elements)
{
node.Element("author").Value;//获取对应名称子元素的文本内容
node.Element("title").Value;
node.Element("price").Value;
node.Attribute("ID").Value;//获取属性值
node.Attribute("Type").Value;
}
[3.2]插入数据 追加新节点到xml文件中
XElement xe = XElement.Load(path);
XElement record = new XElement(
new XElement("book",
new XAttribute("Type", "选修课"),
new XAttribute("ID","1111111"),
new XElement("title", "计算机操作系统"),
new XElement("author", "xin"),
new XElement("price", 28.00)
)
);
xe.Add(record);
xe.Save(@"..\..\Book.xml");
[3.3] 删除数据 删除指定节点
XElement xe = XElement.Load(@"..\..\Book.xml");
IEnumerable elements = from ele in xe.Elements("book")
where (string)ele.Attribute("ID") == id
select ele;//linq查询出指定ID的节点
if(elements.Count()>0){
elements.First().Remove();
}
xe.Save(@"..\..\Book.xml");
删除所有节点
XElement xe = XElement.Load(@"..\..\Book.xml");
IEnumerable elements = from ele in xe.Elements("book") select ele;
if(elements.Count()>){
elements.Remove();
}
xe.Save(@"..\..\Book.xml");
[3.4]修改节点信息
XElement xe = XElement.Load(@"..\..\Book.xml");
string id = dgvBookInfo.CurrentRow.Cells[1].Value.ToString();
IEnumerable element = from ele in xe.Elements("book")
where ele.Attribute("ID").Value == id
select ele;//查询查指定节点
if (element.Count() > 0){
XElement first=element.First();
first.SetAttributeValue("Type", dgvBookInfo.CurrentRow.Cells[0].Value.ToString());///设置新的属性
first.ReplaceNodes(
new XElement("title", dgvBookInfo.CurrentRow.Cells[2].Value.ToString()),
new XElement("author", dgvBookInfo.CurrentRow.Cells[3].Value.ToString()),
new XElement("price", (double)dgvBookInfo.CurrentRow.Cells[4].Value)
);//替换新的节点
}
xe.Save(@"..\..\Book.xml");