xml文件读取方法
- XmlDocument:需要将整个xml文件加载到内存,大型xml文件不建议使用这种方法。
- XmlTextReader: 保持连接逐条读取,只能向下读取,占用内存很小,适用于大型xml文件。
- Linq to Xml: 语法简单易易理解
XmlDocument:
读取:
创建XMLDocument对象
XmlDocument xmldoc=new XmlDocument();
XmlReaderSettings settings=new XmlReaderSettings();
//忽视注释
settings.IgnoreComments=true;
XmlReader reader=XmlReader.Create(@"url",settings);
//加载Xml文件到内存
xmldoc.Load(reader);
//得到根节点
XmlNode rootNode=xmldoc.SelectSingleNode("rootname");
//得到rootname节点下的所有子节点
XmlNodeList nodes = rootNode.ChlidNodes;
//遍历nodes
for(XmlNode node in nodes){
XmlElement xeNode=(XmlElement)node;
//得到指定名称ename的属性值
var s = xeNode.GetAttribute("ename").ToString();
XmlNodeList nodecc = xeNode.ChildNodes;
//得到当前节点的下标为index的子节点的值
nodecc.Item(index).innerText;
}
reader.Close();//最后读取完毕,关掉reader
添加:
XmlDocument xmldoc=new XmlDocument();
xmldoc.Load(@"..\..\..\**.xml");
//找到跟节点rootname
XmlNode root=xmldoc.SelectSingNode("rootname");
//创建新元素node => [<book Type="ssss"> </book> ]
XmlElement node = xmldoc.CreateElement("book");
//创建节点属性
XmlAttribute nodeAttr = xmldoc.CreateAttribute("Type");
nodeAttr.InnerText="ssss";
//属性绑定到节点上
node.SetAttributeNode(nodeAttr);
//创建新元素nodec => <author>dddd</author>
XmlElement nodec=xmldoc.CreateElement("author");
nodec.InnerText="dddd";//设置元素文本内容
//添加到node节点中
node.AppendChild(nodec);
//添加到root节点中
root.AppendChild(node);
xmldoc.Save(@"..\..\..\**.xml");
清空
XmlDocument xmldoc=new XMLDocument();
xmldoc.load("");
xmldoc.Save(@"..\..\Book.xml");
删除节点
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(@"..\..\..\**.xml");
//DocumentElement获取xml文档对象的根XmlElement
var root = xmldoc.DocumentElement;
string xePath = $"/bookstore/book[@ISBN=\"{attrname}\"]";
var node = (XmlElement)root.SelectSingleNode(xePath);
node.ParentNode.RemoveChild(tagElement );
xmldoc.Save(@"..\..\..\**.xml")
修改
var xmldoc = new XmlDocument();
xmldoc.Load(@"..\..\..\**.xml");
var root = xmldoc.DocumentElement;
string xePath = $"/bookstore/book[@ISBN=\"{attrname}\"]";
//selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
var node = (XmlElement)xe.SelectSingleNode(xePath);
node .SetAttribute("Type", "999");
node.GetElementsByTagName("title").Item(0).InnerText = "title";
node.GetElementsByTagName("author").Item(0).InnerText = "authot";
xmldoc.Save(@"..\..\Book.xml");
XmlTextReader XmlTextWriter
XmlTextReader
//创建读取流
var reader=new XmlTextReader(path);
//开始读取
while(reader.Read())
{
if(reader.NodeType == XmlNodeType.Element)
{
switch(reader.Name)
{
case "book":
for(int i=0;i<reader.AttributeCount;i++){
reader.MoveToAttribute(i);
string str = "属性:" + reader.Name + "=" + reader.Value;
}
//获取节点指定索引的属性值
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);
XmlT写xml文件时默认覆盖原文件,如果原文件不存在则创建新文件extWriter
var writer = new XmlTextWriter(@"..\..\**.xml", null);
writer.Formatting=Formatting.Indented;
writer.WriteStartDocument(flase);
//root节点
writer.WriteStartElement("root");
//创建注释
writer.WriteComment("图书信息");
writer.WriteStartElement("book");//创建图书节点
writer.WriteAttributeString("Type", "选修课");//创建设置属性值
writer.WriteAttributeString("ID", "111111111");
writer.WriteElementString("author","卡耐基");//创建单个节点
writer.WriteElementString("title", "人性的弱点");
writer.WriteElementString("price", "56.00");
writer.WriteEndElement();//图书节点创建完成
//root节点
writer.WriteEndElement();
writer.Flush();
writer.Close();
Linq 查询读取 Xml文件
var xmldoc = XElement.Load(@"..\..\**.xml");
//查询出所有标签名nodename的元素
var nodes = from node in xmldoc.Elements("nodename")
select xmldoc;
foreach (var node in nodes)
{
//获取属性attrname的值
node.Attribute("attrname").Value;
//获取对应名称子nodename的文本内容
node.Element("nodename").Value;
}
插入
var xmldoc = XElement.Load(path);
var node = new XElement(
new node("nodename",
new XAttribute("attrname", "选修课"),
new XElement("nodename", "计算机操作系统"),
)
);
xmldoc.Add(record);
xmldoc.Save(@"..\..\**.xml");
删除指定节点
var xmldoc = XElement.Load(@"..\..\**.xml");
//linq查找所有匹配的节点
var nodes = from node in xmldoc.Elements("nodename")
where (string)node.Attribute("attrname") == attrval
select node;
if(nodes.Count()>0)
{
nodes.First().Remove();
}
xmldoc.Save(@"..\..\**.xml");
修改节点信息
var xmldoc = XElement.Load(@"..\..\**.xml");
//查询查指定节点
var nodes = from node in xmldoc.Elements("nodename")
where node.Attribute("attrname").Value == attrval
select ele;
if (element.Count() > 0)
{
XElement first=element.First();
first.SetAttributeValue("Type","11")
//替换新的节点
first.ReplaceNodes(
new XElement("title", "title"),
new XElement("author", "author"),
new XElement("price", "price")
);
}
xmldoc.Save(@"..\..\**.xml");