# XML

  • XML 指的是可扩展标记语言(eXtensible Markup Language)
  • XML 被设计用来传输和存储数据,其焦点是数据的内容。HTML 则用来表现数据,其焦点是数据的外观。
  • XML 在 Web 中起到的作用接近于 HTML。XML 是各种应用程序之间进行数据传输的最常用的工具。
  • XML 数据能够存储在独立的.xml 文件中。
  • XML 是独立于软件和硬件的信息传输工具。

# XML 的用途

  • XML 规定了文本的编辑格式,统一格式可以简化数据共享、简化数据传输、简化平台变更
  • XML 可以分离数据和其它逻辑(例:更改某个数值时,不需要更改源码,只需要更改 XML 文件中的记录即可)

# XML 树结构

  • XML 将数据组织成为一棵树,它从 “根部” 开始,扩展到 “枝叶”。
  • 利用缩进表示层级关系
所有的节点均以<name>开头,以</name>结尾
<?xml version="1.0" encoding="UTF-8"?>  XML声明。它声明XML的版本(1.0)和所使用的编码(UTF-8)
<root_CharacterTemplateData>  根节点。xml必须包含根节点,该节点是所有其他节点的父节点。
  <CharacterTemplateData id="0" name="xml">  子节点,id和name是子节点的属性
    <JobID>1</JobID>  子节点的子节点,1 是节点值
    <JobMode>none</JobMode>
    <InitForce>1.1</InitForce>
  </CharacterTemplateData>
</root_CharacterTemplateData>

# XML 语法

# 版本和编码的信息可以省略

  • 默认编码是:UTF-8
  • UTF-8 也是 HTML5, CSS, JavaScript, PHP, 和 SQL 的默认编码。
<?xml version="1.0" encoding="UTF-8"?>

# 所有的 XML 元素都必须有一个关闭标签

所有的节点均以<name>开头,以</name>结尾
<name>1</name>

# xml 必须包含根节点,该节点是所有其他节点的父节点

root是根节点
<root>
  <child>1</child>
</root>

# 大小写敏感

以下二者是不同的
<name>1</name>
<Name>1</Name>

# 必须正确嵌套

<a><b>Test</b></a>  正确嵌套
<a><b>Test</a></b>  这是错误的

# 属性值必须加引号

<Test id="0" name="xml"></Test>

# 特殊符号

  • xml 中有一些特殊符号不能直接使用
  • 使用预定义符号代替这些特殊符号
预定义符号特殊符号解释
&lt;<小于
&gt;>大于
&amp;&
&apos;'单引号
&quot;"双引号

# XML 中的注释

<!-- annotate -->

# 在 XML 中,空格会被保留

  • XML 文档中的空格不会被删减
  • HTML 会把多个连续的空格字符裁减(合并)为一个

# XML 元素

XML 元素指的是从开始标签到结束标签的部分(包括开始标签和结束标签)

XML 元素可以包含一下内容

  • 其他元素内容
  • 属性
  • 文本内容

XML 命名规则

  • 名称可以包含字母、数字以及其他的字符
  • 名称不能以数字或者标点符号开始
  • 名称不能以字母 xml(或者 XML、Xml 等等)开始
  • 名称不能包含空格
  • 名称不能直接使用 xml 特殊符号(如:“<”)
  • 名称应避免使用某些符号(如:“-”、“.”、“:”),它们在不同的软件中可能会有不同的定义

# XML 属性

属性提供有关元素的额外信息(例如:ID 属性用于标识 XML 元素)。没有什么规矩可以告诉我们什么时候使用属性,什么时候使用元素。因为属性难以阅读和维护,所以应该避免使用它。如果信息看起来像是数据,那就使用元素吧。

# 使用 CSharp 创建、更改、读取 XML

using System.Xml;
public class Program
{
    /// <summary>
    /// 文件路径
    /// </summary>
    private static string Path = "C:/Users/25417/Desktop/Test.xml";
    /// <summary>
    /// 创建 XML
    /// </summary>
    private static void CreateXML()
    {
        // 检查 xml 是否存在,如果没有文件则创建
        if (File.Exists(Path))
        {
            Console.WriteLine("The file already exists: " + Path);
            return;
        }
        // 创建 xml 实例
        XmlDocument xmlDoc = new XmlDocument();
        // 创建根节点
        XmlElement root = xmlDoc.CreateElement("root_CharacterTemplateData");
        // 在 xml 实例中追加根节点
        xmlDoc.AppendChild(root);
        // 创建一级子节点
        XmlElement elmNew = xmlDoc.CreateElement("CharacterTemplateData");
        // 设置一级子节点的两个属性
        elmNew.SetAttribute("id", "0");
        elmNew.SetAttribute("name", "xml");
        // 在跟节点中追加一级节点
        root.AppendChild(elmNew);
        // 创建二级节点
        XmlElement jobID = xmlDoc.CreateElement("JobID");
        // 设置二级节点值
        jobID.InnerText = "1";
        // 在一级节点中追加二级节点
        elmNew.AppendChild(jobID);
        XmlElement jobMode = xmlDoc.CreateElement("JobMode");
        jobMode.InnerText = "none";
        elmNew.AppendChild(jobMode);
        XmlElement initForce = xmlDoc.CreateElement("InitForce");
        initForce.InnerText = "1.1";
        elmNew.AppendChild(initForce);
        // 保存 xml 文件
        xmlDoc.Save(Path);
    }
    /// <summary>
    /// 添加 XML
    /// </summary>
    private static void AddXML()
    {
        if (!File.Exists(Path))
        {
            Console.WriteLine("The file does not exist: " + Path);
            return;
        }
        // 创建 xml 实例
        XmlDocument xmlDoc = new XmlDocument();
        // 读取 xml 文件
        xmlDoc.Load(Path);
        // 找到指定的节点
        XmlNode root = xmlDoc.SelectSingleNode("root_CharacterTemplateData");
        XmlElement elmNew = xmlDoc.CreateElement("CharacterTest");
        elmNew.SetAttribute("id", "1");
        root.AppendChild(elmNew);
        XmlElement elmNew_0 = xmlDoc.CreateElement("CharacterTest_0");
        elmNew_0.InnerText = "2";
        elmNew.AppendChild(elmNew_0);
        xmlDoc.Save(Path);
    }
    /// <summary>
    /// 更改 XML
    /// </summary>
    private static void ChangeXML()
    {
        if (!File.Exists(Path))
        {
            Console.WriteLine("The file does not exist: " + Path);
            return;
        }
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(Path);
        XmlNode root = xmlDoc.SelectSingleNode("root_CharacterTemplateData");
        // 遍历并获取 XmlElement 类型的子节点,因为 XmlNode 中没有 SetAttribute () 方法
        foreach (XmlElement item in root.ChildNodes)
        {
            // 更改 XML
            if (item.Name == "CharacterTemplateData" &&
                item.GetAttribute("id") == "0")
            {
                // 更改节点属性
                item.SetAttribute("id", "1");
                // 更改子节点值
                XmlNode jobID = item.SelectSingleNode("JobID");
                jobID.InnerText = "2";
            }
            // 删除 XML 中的内容
            if (item.Name == "CharacterTest" &&
                item.HasAttribute("id"))
            {
                // 删除属性
                item.RemoveAttribute("id");
                // 删除子节点
                XmlNode test_0 = item.SelectSingleNode("CharacterTest_0");
                item.RemoveChild(test_0);
                // 删除全部
                //item.RemoveAll();
                //item.RemoveAllAttributes();
            }
        }
        xmlDoc.Save(Path);
    }
    /// <summary>
    /// 读取 XML
    /// </summary>
    private static void ReadXML()
    {
        if (!File.Exists(Path))
        {
            Console.WriteLine("The file does not exist: " + Path);
            return;
        }
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(Path);
        // 获取根节点
        XmlElement root = xmlDoc.DocumentElement;
        Console.WriteLine("rootName: " + root.Name);
        // 遍历根节点的子节点
        foreach (XmlElement item in root.ChildNodes)
        {
            Console.WriteLine(item.Name);
            // 遍历属性
            foreach (XmlAttribute attribute in item.Attributes)
            {
                Console.WriteLine("Attribute_" + attribute.Name + ": " + attribute.InnerText);
            }
            // 遍历子节点的子节点
            foreach (XmlElement childNode in item.ChildNodes)
            {
                Console.WriteLine("ChildNode_" + childNode.Name + ": " + childNode.InnerText);
            }
        }
    }
    public static void Main()
    {
        CreateXML();
        AddXML();
        ChangeXML();
        ReadXML();
    }
}
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Maikire 微信支付

微信支付

Maikire 支付宝

支付宝

Maikire 贝宝

贝宝