C#操作XML方式


系列目錄

前言#

前一篇XML讀取,現在咱們繼續XML操作相關

C#中也有三種操作(增、刪、改、查)XML文件方法如下:

  1. 使用 XmlDocument(DOM模式)
  2. 使用 XmlTextWriter(流模式)
  3. 使用 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 修改某一記錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM