前言
XML是 Extensible Markup Language 的簡稱,用于存儲和傳輸數據的可擴展標記語言。它被應用在數據交換、數據存儲、Web服務、網絡協議等場景。XML 具有可擴展性、結構化、標準化、簡單易讀等幾個特點。
基本結構
XML 基本結構包括文檔聲明、根元素、子元素、屬性、注釋、處理指令等部分。<?xml version="1.0" encoding="UTF-8"?>
<根元素>
<子元素 屬性="屬性值">內容</子元素>
<!-- 注釋內容 -->
<?處理指令 ?>
</根元素>
文檔聲明
文檔聲明主要用于描述XML文檔的版本與編碼格式,每個文檔必須包含一個聲明,并在文檔開頭。如下聲明:版本1.0 編碼格式為UTF-8。<?xml version="1.0" encoding="UTF-8"?>
根元素
根元素包圍文檔中的所有數據,是其它元素的根,每個文檔必須有一個根元素。如下示例:有一個configure根元素,其下有其它內容。<configure>
<Description>Fountain WinForm App</Description>
<Files>
<File Version="1.2.11.0" Name="log4net.dll" DateTime="2023-4-26" />
</Files>
</configure>
子元素
子元素是文檔的基本單元,它包含屬性、內容等元素。如下示例:<name>Apple</name>
<File Version="1.2.11.0" Name="log4net.dll" DateTime="2023-4-26" />
屬性
元素可以有屬性,用于元素的額外信息。它在開始標簽中定義,以名稱/鍵值對的形式出現。如下示例:File 元素存在Version、Name、DateTime屬性。<File Version="1.2.11.0" Name="log4net.dll" DateTime="2023-4-26" />
注釋
注釋為文檔中添加注釋或說明,以<!--開始,以-->結束。如下示例:<configure>
<Description>Fountain WinForm App</Description>
<Files>
<!-- 程序的所文件名稱、版本、更新日期 -->
<File Version="1.2.11.0" Name="log4net.dll" DateTime="2023-4-26" />
</Files>
</configure>
處理指令
處理指令提供了關于XML處理器如何處理文檔的指令。如下示例:標識 文檔的樣式表。 <?xml-stylesheet type="text/xsl" href="sample.xsl"?>
命名空間
文檔操作
通過System.XML命名空間中的類可以完成常用的操作。下表為操作XML文檔相關的類。類 | 描述 |
---|
XmlDocument | 創建、修改及保存XML文檔。 |
XmlNode | 表示 XML 文檔中的單個節點 |
XmlElement | 訪問元素的名稱、屬性和子元素。 |
XmlTextWriter | 提供快速、非緩存的寫入器。 |
XPathDocument | 提供只讀形式讀取XML文檔。 |
XPathNavigator | 提供瀏覽、提取XML節點 數據 |
XmlAttribute | 訪問XML屬性的名稱和值 |
XmlText | 訪問文本內容 |
創建文檔
通過 XmlDocument 的 CreateXmlDeclaration 對 XML 文檔進行聲明,再通過 CreateElement 創建 XML 元素,最后保存 XML 文件。下面通過代碼進一步了解 XML 文檔的創建。using System;
using System.IO;
using System.Windows.Forms;
using System.Xml;
namespace Fountain.WinForm.XMLDemo
{
public partial class XMLDemoForm : Form
{
public XMLDemoForm()
{
InitializeComponent();
}
/// <summary>
/// 創建文檔
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreate_Click(object sender, EventArgs e)
{
try
{
XmlDocument xmlDocument = new XmlDocument();
// XML聲明
XmlDeclaration xmlDeclaration = xmlDocument.CreateXmlDeclaration("1.0", "utf-8", "yes");
xmlDocument.AppendChild(xmlDeclaration);
//創建根元素
XmlElement rootNode = xmlDocument.CreateElement("configure");
xmlDocument.AppendChild(rootNode);
// 創建 Description 子元素
XmlElement descSubElement = xmlDocument.CreateElement("Description");
//元素內容
descSubElement.InnerText = "Fountain WinForm App";
rootNode.AppendChild(descSubElement);
// 創建 Updater 子元素
XmlElement updaterSubElement = xmlDocument.CreateElement("Updater");
rootNode.AppendChild(updaterSubElement);
// 創建 url 子元素
XmlElement urlSubElement = xmlDocument.CreateElement("url");
//中間文本
urlSubElement.InnerText = "http://127.0.0.1/update";
// 添加到父結點
updaterSubElement.AppendChild(urlSubElement);
XmlElement versionSubElement = xmlDocument.CreateElement("Version");
//中間文本
versionSubElement.InnerText = "3.8.0.24043";
// 添加到父結點
updaterSubElement.AppendChild(versionSubElement);
// 創建 Files 子元素
XmlElement filesSubElement = xmlDocument.CreateElement("Files");
rootNode.AppendChild(filesSubElement);
// 創建 File 子元素
XmlElement fileSubElement = xmlDocument.CreateElement("File");
// 屬性
fileSubElement.SetAttribute("Version", "1.2.11.0");
fileSubElement.SetAttribute("Name", "log4net.dll");
fileSubElement.SetAttribute("DateTime", DateTime.Now.ToString("yyyy-MM-dd"));
filesSubElement.AppendChild(fileSubElement);
// 保存文檔
xmlDocument.Save(string.Format("{0}{1}{2}", Application.StartupPath,Path.DirectorySeparatorChar, "Version.xml"));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<configure>
<Description>Fountain WinForm App</Description>
<Updater>
<url>http://127.0.0.1/update</url>
<Version>3.8.0.24043</Version>
</Updater>
<Files>
<File Version="1.2.11.0" Name="log4net.dll" DateTime="2024-04-13" />
</Files>
</configure>
讀取文檔
通過 XmlDocument 的 Load 對 XML 文檔進行加載XML文件,然后通過 SelectSingleNode 得到指定的節點元素,再通過 GetAttribute 得到具體的屬性值。下面通過代碼進一步了解 XML 文檔的讀取。using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Xml;
namespace Fountain.WinForm.XMLDemo
{
public partial class XMLDemoForm : Form
{
public XMLDemoForm()
{
InitializeComponent();
}
/// <summary>
/// 讀取文檔
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonRead_Click(object sender, EventArgs e)
{
try
{
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(string.Format("{0}{1}{2}", Application.StartupPath, Path.DirectorySeparatorChar, "Version.xml"));
// 獲取 Files
XmlNode XmlNode = xmlDocument.SelectSingleNode("configure");
// 得到根節點的所有子節點
XmlNodeList xmlNodeList = XmlNode.ChildNodes;
StringBuilder stringBuilder = new StringBuilder();
// 循環讀取
foreach (XmlNode xmlNode in xmlNodeList)
{
// 判斷節點是否有子節點
if (xmlNode.ChildNodes.Count>0)
{
foreach (XmlNode subXmlNode in xmlNode.ChildNodes)
{
stringBuilder.AppendLine(string.Format("{0}:{1}", subXmlNode.Name, subXmlNode.InnerText));
// 讀取元素屬性
if (subXmlNode.Attributes!=null && subXmlNode.Attributes.Count>0)
{
for (int i = 0; i < subXmlNode.Attributes.Count;i++)
{
stringBuilder.AppendLine(string.Format("{0}:{1} 屬性{2}={3}",
subXmlNode.Name,
subXmlNode.InnerText,
subXmlNode.Attributes[i].Name,
subXmlNode.Attributes[i].Value));
}
}
}
continue;
}
stringBuilder.AppendLine(string.Format("{0}:{1}", xmlNode.Name,xmlNode.InnerText));
}
// MessageBox.Show(stringBuilder.ToString());
Console.WriteLine(stringBuilder.ToString());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
#text:Fountain WinForm App
url:http://127.0.0.1/update
Version:3.8.0.24043
File:
File: 屬性Version=1.2.11.0
File: 屬性Name=log4net.dll
File: 屬性DateTime=2024-04-13
修改文檔
通過 XmlDocument 的 Load 對 XML 文檔進行加載XML文件,然后讀取到元素節點,對元素節點進行刪除、變屬性值、元素文本等,最后保存 XML 文件。下面通過代碼進一步了解 XML 文檔的修改。using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Xml;
namespace Fountain.WinForm.XMLDemo
{
public partial class XMLDemoForm : Form
{
public XMLDemoForm()
{
InitializeComponent();
}
/// <summary>
/// 修改文檔
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonModify_Click(object sender, EventArgs e)
{
try
{
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(string.Format("{0}{1}{2}", Application.StartupPath, Path.DirectorySeparatorChar, "Version.xml"));
// 獲取根元素
XmlNode rootNode = xmlDocument.DocumentElement;
// 獲取主信息
XmlNodeList xmlNodeList = rootNode.SelectNodes("Updater");
foreach (XmlNode xmlNodeUpdate in xmlNodeList)
{
XmlNodeList xmlNodeMainInfo = xmlNodeUpdate.ChildNodes;
foreach (XmlNode xmlMainInfo in xmlNodeMainInfo)
{
if ("url".Equals(xmlMainInfo.Name,StringComparison.OrdinalIgnoreCase))
{
// 刪除 url 元素節點
xmlNodeUpdate.RemoveChild(xmlMainInfo);
break;
}
}
}
// 循環讀取
foreach (XmlNode xmlNode in xmlNodeList)
{
if (xmlNode.ChildNodes.Count > 0)
{
foreach (XmlNode subXmlNode in xmlNode.ChildNodes)
{
if (subXmlNode.Attributes != null && subXmlNode.Attributes.Count > 0)
{
for (int i = 0; i < subXmlNode.Attributes.Count; i++)
{
if ("DateTime".Equals(subXmlNode.Attributes[i].Name,StringComparison.OrdinalIgnoreCase))
{
// 修改元素節點屬性
subXmlNode.Attributes[i].Value = DateTime.Now.ToString("yyyy-MM-dd");
}
}
}
}
continue;
}
}
xmlDocument.Save(string.Format("{0}{1}{2}", Application.StartupPath, Path.DirectorySeparatorChar, "Version.xml"));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<configure>
<Description>Fountain WinForm App</Description>
<Updater>
<Version>3.8.0.24043</Version>
</Updater>
<Files>
<File Version="1.2.11.0" Name="log4net.dll" DateTime="2024-04-13" />
</Files>
</configure>
小結
以上 XML 文檔相關內容及在C#中如何實現對文件創建、修改、讀取的操作。
該文章在 2024/6/8 22:48:35 編輯過