person.xml

<?xml version="1.0" encoding="utf-8"?> <MyP> <P1> <Person id="cz001"> <Name>張三</Name> <Age>18</Age> </Person> <Person id="cz002"> <Name>李四</Name> <Age>19</Age> </Person> <Person id="cz003"> <Name>王五</Name> <Age>20</Age> </Person> </P1> <P2> <Person> <Name>張三2</Name> <Age>18</Age> </Person> <Person> <Name>李四2</Name> <Age>19</Age> </Person> <Person> <Name>王五2</Name> <Age>20</Age> </Person> </P2> </MyP>

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Xml操作 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //讀取XML System.Xml.Linq.XDocument xdoc = System.Xml.Linq.XDocument.Load("person.xml"); System.Xml.Linq.XElement xeRoot = xdoc.Root; //根節點 System.Xml.Linq.XElement xele = xeRoot.Element("P1").Element("Person"); //子節點 MessageBox.Show("id=" + xele.Attribute("id").Value); //cz001 foreach (var ele in xele.Elements()) { string str = string.Format("Name={0},Value={1}", ele.Name.ToString(), ele.Value); MessageBox.Show(str); } } private void Form1_Load(object sender, EventArgs e) { //*讀取XML數據加載到treeView1列表中。 //1、加載person.xml System.Xml.Linq.XDocument xdoc = System.Xml.Linq.XDocument.Load("person.xml"); //2、獲取根節點,MyP System.Xml.Linq.XElement xeRoot = xdoc.Root; //3、先把根節點添加到treeView1上 TreeNode treeViewRoot = treeView1.Nodes.Add(xeRoot.Name.LocalName); //4、開始遍歷所有的子節點,使用遞歸 LoadTreeNodes(xeRoot, treeViewRoot); //*寫入XML文件。 //1、創建XML對象 System.Xml.Linq.XDocument xdocument = new System.Xml.Linq.XDocument(); //2、創建跟節點 System.Xml.Linq.XElement eRoot = new System.Xml.Linq.XElement("根節點"); //添加到xdoc中 xdocument.Add(eRoot); //3、添加子節點 System.Xml.Linq.XElement ele1 = new System.Xml.Linq.XElement("子節點1"); ele1.Value = "內容1"; eRoot.Add(ele1); //4、為ele1節點添加屬性 System.Xml.Linq.XAttribute attr = new System.Xml.Linq.XAttribute("url", "http://www.baidu.com"); ele1.Add(attr); //5、快速添加子節點方法 eRoot.SetElementValue("子節點2", "內容2"); //6、快速添加屬性 ele1.SetAttributeValue("id", 12); //7、最后保存到文件,也可以寫入到流中。 xdocument.Save("123.xml"); } private void LoadTreeNodes(System.Xml.Linq.XElement xeRoot, TreeNode treeViewRoot) { //把xeRoot下面的所有內容循環綁定treeView上 foreach (System.Xml.Linq.XElement ele in xeRoot.Elements()) { //判定子根節點下是否還有子節點 if (ele.Elements().Count() > 0) { TreeNode node = treeViewRoot.Nodes.Add(ele.Name.ToString()); //寫入Name值 //獲取節點上的屬性方法 System.Xml.Linq.XAttribute attr = ele.Attribute("id"); if (attr != null) { node.Text += string.Format(" [{0}={1}]", attr.Name, attr.Value); } LoadTreeNodes(ele, node); //遍歷循環 } else { treeViewRoot.Nodes.Add(ele.Value); //寫入節點下的Value } } } } }
重新學習xml操作和xml序列化
1、先了解下xml格式,並手動創建xml文件。
1、XML只能有一個根節點。
2、XML有開始標記就必須有結束標記。
3、XML元素的屬性值必須有引號。
4、XML必須有結束標記,大小寫必須跟開始標記一致。
5、XML文件編碼必須跟encoding指定編碼要一致。
123.xml文件:
<?xml version="1.0" encoding="utf-8" ?> <hgx> <P1> <Person ID="h001"> <Name>張三</Name> <Age>18</Age> </Person> <Person ID="h002"> <Name>李四</Name> <Age>20</Age> </Person> </P1> <P2> <Person ID="h003"> <Name>王五</Name> <Age>21</Age> </Person> <Person ID="h004"> <Name>趙六</Name> <Age>25</Age> </Person> </P2> </hgx>
2、通過XDocument類訪問讀取xml文件。
static void Main(string[] args) { XDocument xDoc = XDocument.Load("123.xml"); //加載xml文件 XElement root = xDoc.Root; //獲取根節點 //通過遞歸,獲取所有下面的子元素 GetXElement(root); Console.ReadKey(); } private static void GetXElement(XElement root) { //返回IEnumerable接口的對象,都可以實現foreach循環遍歷 foreach (XElement element in root.Elements()) { //遞歸 if (element.Elements().Count() > 0) { Console.WriteLine(element.Name); GetXElement(element); } else { Console.WriteLine(element.Value); } } }
3、將123.xml文件內容加載到TreeView控件中顯示。
private void button1_Click(object sender, EventArgs e) { XDocument xDoc = XDocument.Load("123.xml"); XElement root = xDoc.Root; //獲取根元素 TreeNode treeNode = this.treeView1.Nodes.Add(root.Name.ToString()); LoadNodes(root, treeNode); } private void LoadNodes(XElement root, TreeNode treeNode) { foreach (XElement element in root.Elements()) { if (element.Elements().Count() > 0) { TreeNode node = treeNode.Nodes.Add(element.Name.ToString()); //獲取屬性 foreach (XAttribute attr in element.Attributes()) { node.Text += " [" + attr.Name.ToString() + "=" + attr.Value + "]"; } LoadNodes(element, node); } else { TreeNode node = treeNode.Nodes.Add(element.Value); } } }
4、寫入xml操作
private void button2_Click(object sender, EventArgs e) { //創建XML對象 XDocument xDoc = new XDocument(); //創建一個根節點 XElement root = new XElement("Root"); xDoc.Add(root); //將根節點加入到XML對象中 //創建一個子節點 XElement xele = new XElement("User"); root.Add(xele); //添加屬性 XAttribute attr = new XAttribute("ID", 1); xele.Add(attr); xele.SetElementValue("Name", "張三"); xele.SetElementValue("Age", "18"); //保存xml文件 xDoc.Save("User.xml"); }
User.xml文件:
<?xml version="1.0" encoding="utf-8"?> <Root> <User ID="1"> <Name>張三</Name> <Age>18</Age> </User> </Root>
5、xml序列化和反序列化操作
Person類:
public class Person { public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } [XmlIgnore] //此屬性不被序列化,System.Xml.Serialization.XmlIgnoreAttribute public bool Gender { get; set; } }
xml序列化:
private void button3_Click(object sender, EventArgs e) { List<Person> list = new List<Person>(); Person p1 = new Person() { ID = 1, Name = "張三", Age = 18 }; Person p2 = new Person() { ID = 2, Name = "李四", Age = 20 }; list.Add(p1); list.Add(p2); //xml序列化,System.Xml.Serialization.XmlSerializer XmlSerializer xmlSer = new XmlSerializer(typeof(List<Person>)); using (System.IO.FileStream fs = System.IO.File.OpenWrite("Person.xml")) { xmlSer.Serialize(fs, list); } }
Person.xml文件:
<?xml version="1.0"?> <ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Person> <ID>1</ID> <Name>張三</Name> <Age>18</Age> </Person> <Person> <ID>2</ID> <Name>李四</Name> <Age>20</Age> </Person> </ArrayOfPerson>
xml反序列化:
private void button4_Click(object sender, EventArgs e) { List<Person> list = new List<Person>(); //xml反序列化 XmlSerializer xmlSer = new XmlSerializer(typeof(List<Person>)); using (System.IO.FileStream fs = System.IO.File.OpenRead("Person.xml")) { list = (List<Person>)xmlSer.Deserialize(fs); } foreach (Person p in list) { MessageBox.Show(string.Format("ID:{0},Name:{1},Age:{2}", p.ID, p.Name, p.Age)); } }