C# XML 讀取和寫入示範

建立 XML 檔案示範

    
using System.Xml;


XmlDocument document = new XmlDocument();

// 建立 XML 宣告
XmlDeclaration xmlDeclaration = document.CreateXmlDeclaration("1.0", "UTF-8", null);
document.InsertBefore(xmlDeclaration, document.DocumentElement);

// 根節點
XmlElement rootNode = document.CreateElement("Root");
document.AppendChild(rootNode); // 加入節點

XmlElement childNode1 = document.CreateElement("Child1");
childNode1.SetAttribute("attr1", "attr-1"); // 設定屬性
rootNode.AppendChild(childNode1);

XmlElement childNode1_1 = document.CreateElement("Child1-1");
childNode1_1.InnerText = "child 1-1"; // 設定內容
childNode1.AppendChild(childNode1_1);

XmlElement childNode2 = document.CreateElement("Child2");
childNode2.InnerText = "child-2";
rootNode.AppendChild(childNode2);

XmlElement childNode3 = document.CreateElement("Child3");
rootNode.AppendChild(childNode3);

// 儲存至檔案
document.Save("my.xml");
    

輸出結果:
    
<?xml version="1.0" encoding="UTF-8"?>
<Root>
  <Child1 attr1="attr-1">
    <Child1-1>child 1-1</Child1-1>
  </Child1>
  <Child2>child-2</Child2>
  <Child3 />
</Root>
    

可以看到上方 Child3 因為沒有內容,是空元素,所以自動省略結束標籤,使用封閉斜線關閉標籤(下方第一行)。
    
<Child3 /> <!-- 使用封閉斜線,沒有結束標籤 -->
<Child3></Child3> <!-- 有起始標籤和結束標籤 -->
    

如果希望以上方第二行的方式顯示,可以透過將 IsEmpty 設定為 false 的方式解決:
    
childNode3.IsEmpty = false;
    

讀取 XML 檔案示範

    
using var reader = XmlReader.Create("my.xml"); // 目標檔案
XmlDocument document = new XmlDocument();
document.Load(reader);
reader.Close();

// 取得 Root 下的所有節點
XmlNodeList? rootNodes = document.SelectNodes("/Root/*");
Console.WriteLine($"Root 下的節點數量: {rootNodes?.Count}"); // Root 下的節點數量: 3
foreach (var node in rootNodes)
{
    Console.WriteLine($"node: {((XmlNode)node).Name}");
    /*
    node: Child1
    node: Child2
    node: Child3
    */
}

// 讀取指定節點
XmlNode? child1_1 = document.SelectSingleNode("/Root/Child1/Child1-1");
Console.WriteLine($"text: {child1_1?.InnerText}"); // text: child 1-1

// 讀取指定節點的屬性
XmlNode? child1 = document.SelectSingleNode("/Root/Child1");
Console.WriteLine($"attr1: {child1?.Attributes?["attr1"]?.Value}"); // attr1: attr-1

// 讀取指定節點的所有屬性
XmlAttributeCollection? child1Attrs = child1?.Attributes;
foreach (XmlAttribute? attr in child1Attrs!)
{
    Console.WriteLine($"attr: {attr?.Name}"); // attr: attr1
}
    



參考資料:
Wiki - XML
Microsoft.Learn - XmlDocument Class

留言