前言#
前一篇XML讀取,現在咱們繼續XML操作相關
C#中也有三種操作(增、刪、改、查)XML文件方法如下:
- 使用 XmlDocument(DOM模式)
- 使用 XmlTextWriter(流模式)
- 使用 Linq to Xml(Linq模式)
使用XmlDocument方式操作#
增加節點##
向文件中添加新的數據的時候,首先也是通過XmlDocument加載整個文檔,然后通過調用SelectSingleNode方法獲得根結點,通過CreateElement方法創建元素,用CreateAttribute創建屬性,用AppendChild把當前結點掛接在其它結點上,用SetAttributeNode設置結點的屬性.具體代碼如下:
#region XmlDocument創建或者插入節點
/// <summary>
/// 向文件中添加新的數據的時候,
/// 首先也是通過XmlDocument加載整個文檔,
/// 然后通過調用SelectSingleNode方法獲得根結點,
/// 通過CreateElement方法創建元素,
/// 用CreateAttribute創建屬性,
/// 用AppendChild把當前結點掛接在其它結點上,
/// 用SetAttributeNode設置結點的屬性.具體代碼如下:
/// </summary>
public static void XmlDocumentCreateInsertDemo()
{
//加載文件並選出要結點:
XmlDocument doc = new XmlDocument();
doc.Load(@"d:/demo.xml");
XmlNode root = doc.SelectSingleNode("bookstore");
//創建一個結點,並設置結點的屬性:
XmlElement xelKey = doc.CreateElement("test");
XmlAttribute xelType = doc.CreateAttribute("Type");
xelType.Value = "testvalue";
xelKey.SetAttribute("Type", "testvalue2");
xelKey.SetAttributeNode(xelType);
//注釋節點
XmlComment xco = doc.CreateComment("這是注釋");
//內容節點
XmlElement xelAuthor = doc.CreateElement("author");
xelAuthor.InnerText = "sss";
xelKey.AppendChild(xelAuthor);
xelKey.AppendChild(xco);
root.AppendChild(xelKey);
doc.Save(@"d:/demov2.xml");
}
#endregion XmlDocument創建或者插入節點
刪除、修改##
想要刪除某一個結點,直接找到其父結點,然后調用RemoveChild方法即可,現在關鍵的問題是如何找到這個結點,上面的SelectSingleNode可以傳入一個Xpath表,我們通過書的ISBN號來找到這本書所在的結點
修改某 條數據的話,首先也是用Xpath表達式找到所需要修改的那一個結點,然后如果是元素的話,就直接對這個元素賦值,如果是屬性的話,就用SetAttribute方法設置即可
#region XmlDocument 查找刪除修改
/// <summary>
/// 想要刪除某一個結點,直接找到其父結點,
/// 然后調用RemoveChild方法即可,現在關鍵的問題是如何找到這個結點,
/// 上面的SelectSingleNode可以傳入一個Xpath表,
/// 我們通過書的ISBN號來找到這本書所在的結點
/// </summary>
public static void XmlDocumentSeachDelUpdateDemo()
{
XmlDocument doc = new XmlDocument();
doc.Load(@"d:/demo.xml");
XmlNode root = doc.DocumentElement;
string strPath = string.Format("/bookstore/book[@ISBN=\"{0}\"]", "7-111-19149-6");
XmlElement selectXe = (XmlElement)root.SelectSingleNode(strPath);
//刪除
//selectXe.ParentNode.RemoveChild(selectXe);
selectXe.SetAttribute("Type", "asdfasdf");//也可以通過SetAttribute來增加一個屬性
selectXe.SetAttribute("Typeasdf", "wxcd");//也可以通過SetAttribute來增加一個屬性
selectXe.GetElementsByTagName("title").Item(0).InnerText = "33ee";
XmlElement appxle = doc.CreateElement("windy");
appxle.InnerText = "wwws";
selectXe.AppendChild(appxle);
doc.Save(@"d:/demod.xml");
}
#endregion XmlDocument 查找刪除修改
"/bookstore/book[@ISBN="{0}"]"是一個Xpath表達式,找到ISBN號為所選那一行ISBN號的那本書,有關Xpath的知識請參考:XPath 語法
使用XmlTextWriter方式操作#
XmlTextWriter寫文件的時候,默認是覆蓋以前的文件,如果此文件名不存在,它將創建此文件.首先設置一下,你要創建的XML文件格式.
1: XmlTextWriter myXmlTextWriter = new XmlTextWriter(@"..\..\Book1.xml", null);
2: //使用 Formatting 屬性指定希望將 XML 設定為何種格式。 這樣,子元素就可以通過使用 Indentation 和 IndentChar 屬性來縮進。
3: myXmlTextWriter.Formatting = Formatting.Indented;
然后可以通過WriteStartElement和WriteElementString方法來創建元素,這兩者的區別就是如果有子結點的元素,那么創建的時候就用WriteStartElement,然后去創建子元素,創建完畢后,要調用相應的WriteEndElement來告訴編譯器,創建完畢,用WriteElementString來創建單個的元素,用WriteAttributeString來創建屬性.如下:
#region XmlTextWriterDemo
/// <summary>
/// 然后可以通過WriteStartElement和WriteElementString方法來創建元素,
/// 這兩者的區別就是如果有子結點的元素,那么創建的時候就用WriteStartElement,
/// 然后去創建子元素,創建完畢后,要調用相應的WriteEndElement來告訴編譯器,創建完畢,
/// 用WriteElementString來創建單個的元素,用WriteAttributeString來創建屬性
/// </summary>
public static void XmlTextWriterDemo()
{
XmlTextWriter myXmlTextWriter = new XmlTextWriter(@"d:/demoWriter.xml", null);
//使用 Formatting 屬性指定希望將 XML 設定為何種格式。 這樣,子元素就可以通過使用 Indentation 和 IndentChar 屬性來縮進。
myXmlTextWriter.Formatting = Formatting.Indented;
myXmlTextWriter.WriteStartDocument(true);
myXmlTextWriter.WriteStartElement("root");
myXmlTextWriter.WriteComment("我測試XML編寫");
myXmlTextWriter.WriteStartElement("person");
myXmlTextWriter.WriteAttributeString("name", "windy");
myXmlTextWriter.WriteAttributeString("age", "20");
myXmlTextWriter.WriteElementString("city", "wuxi");
myXmlTextWriter.WriteEndElement();
myXmlTextWriter.WriteEndElement();
myXmlTextWriter.Flush();
myXmlTextWriter.Close();
}
#endregion XmlTextWriterDemo
使用Linq to Xml方式操作#
插入一條數據##
#region 插入一條數據
XElement xe = XElement.Load(@"d:/demoLinq.xml");
XElement record = new XElement(
new XElement("root",
new XElement("book",
new XAttribute("Type", "選修課"),
new XAttribute("ISBN", "7-111-19149-1"),
new XElement("title", "計算機操作系統"),
new XElement("author", "7-111-19149-1"),
new XElement("price", 28.00))));
xe.Add(record);
record.Save(@"d:/demoLinq.xml");
#endregion 插入一條數據
修改某一記錄##
#region 修改某一記錄
//注意:xml必須需要根節點
XElement xe = XElement.Load(@"d:/demoLinq.xml");
string id = "7-111-19149-1";
var elements = from ele in xe.Elements()
where (string)ele.Attribute("ISBN") == id
select ele;
if (elements.Count() > 0)
{
XElement first = elements.First();
///設置新的屬性
first.SetAttributeValue("Type", "11212");
///替換新的節點
first.ReplaceNodes(
new XElement("title", "3435"),
new XElement("author", "55656"),
new XElement("price", "9999")
);
}
xe.Save(@"d:/demoLinq.xml");
#endregion 修改某一記錄
刪除##
#region 刪除選中的數據
XElement xe = XElement.Load(@"d:/demoLinq.xml");
string id = "";
var elements = from ele in xe.Elements("book")
where (string)ele.Attribute("ISBN") == id
select ele;
if (elements.Count() > 0)
{
elements.First().Remove();
}
xe.Save(@"d:/demoLinq.xml");
#endregion 刪除選中的數據
#region 修改某一記錄