using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Xml;
/// <summary>
/// xml文件的读取和创建
/// </summary>
public class XMLDemo : MonoBehaviour
{
void Start()
{
//创建xml文件
//CreateXML();
//解析xml文件的两种方法
//方法一
// ParseXML();
//方法二
//ParseXML2();
ParseXML3();
}
void CreateXML()
{
/*
* 一个xml文件只能有一个root结点,这个root结点的名字可以任意取
<root>
<heros>
<hero id="1">
<name>超人</name>
<age>92</age>
</hero>
<hero id="2">
<name>蝙蝠侠</name>
<age>86</age>
</hero>
<hero id="3">
<name>绿巨人</name>
<age>99</age>
</hero>
</heros>
</root>
*/
//创建一个xml文件
XmlDocument doc = new XmlDocument();
//设置xml文件的版本和编码格式
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", "");
doc.AppendChild(dec);
//创建根节点,并将结点添加进文件中
XmlElement rootEle = doc.CreateElement("root");
doc.AppendChild(rootEle);
//创建heros结点
XmlElement herosEle = doc.CreateElement("heros");
rootEle.AppendChild(herosEle);
//每个英雄对应的属性值存放于string数组中
string[] names = new string[] { "超人", "蝙蝠侠", "绿巨人" };
string[] ages = new string[] { "92", "86", "99" };
for (int i = 0; i < names.Length; i++)
{
//创建hero结点
XmlElement heroEle = doc.CreateElement("hero");
//创建id属性
//第一种方法
//heroEle.SetAttribute("id", i + "");
//第二种方法
XmlAttribute att = doc.CreateAttribute("id");
att.Value = i + "";
heroEle.Attributes.Append(att);
//创建name结点
XmlElement nameEle = doc.CreateElement("name");
nameEle.InnerText = names[i];
heroEle.AppendChild(nameEle);
//创建age结点
XmlElement ageEle = doc.CreateElement("age");
ageEle.InnerText = ages[i];
heroEle.AppendChild(ageEle);
herosEle.AppendChild(heroEle);
}
doc.Save(Application.dataPath + "/XMLDemo/XML/textXML.xml");
}
//解析方法一
void ParseXML()
{
//创建xml文件
XmlDocument doc = new XmlDocument();
//读取xml文档
doc.Load(Application.dataPath + "/XMLDemo/XML/textXML.xml");
//获取根节点
//注意:这里一定需要是LastChild,而不是FirstChild,FirstChild会报错!!
XmlElement rooeEle = doc.LastChild as XmlElement;//doc.LastChild是一个node类型,因为node和element是一样,所以强制转换成XmlElement
//获取heros结点
XmlElement herosEle = rooeEle.FirstChild as XmlElement;
//遍历循环hero结点
foreach (XmlElement heroEle in herosEle)
{
//获取id
string id = heroEle.GetAttribute("id");
//获取name
string name = heroEle.ChildNodes[0].InnerText;
//获取age
string age = heroEle.ChildNodes[1].InnerText;
Debug.Log(id + " " + name + " " + age);
}
}
//解析方法二
void ParseXML2()
{
//创建xml文档类
XmlDocument doc = new XmlDocument();
doc.Load(Application.dataPath + "/XMLDemo/XML/textXML.xml");
/*
XPath解析方法,路径语法
/root/heros/hero/name 绝对路径
//name 相对路径
//heros/hero[2]/name 获取第二个hero结点name
//heros/hero[last()-1]/name 获取倒数第二个结点
//heros/hero[position()<3]/name 获取前两个hero结点
//heros/hero[@id=2]/name 获取属性id为2的heroname
*/
//doc.SelectSingleNode("");//选择一个结点
//读取所有的name结点
XmlNodeList list = doc.SelectNodes("//name");
XmlNodeList list1 = doc.SelectNodes("//heros/hero[position()<3]/name");
foreach (XmlElement ele in list1)
{
Debug.Log(ele.InnerText);
}
}
//有命名空间的解析
void ParseXML3()
{
XmlDocument doc = new XmlDocument();
doc.Load(Application.dataPath + "/XMLDemo/XML/textXML.xml");
//创建一个名称空间管理器
XmlNamespaceManager nsManager = new XmlNamespaceManager(doc.NameTable);
nsManager.AddNamespace("hero", "http://www.baidu.com");
nsManager.AddNamespace("default", "http://www.163.com");
XmlNodeList list1 = doc.SelectNodes("/default:root/default:heros/default:hero/hero:name",nsManager);
foreach (XmlElement ele in list1)
{
Debug.Log(ele.InnerText);
}
}
}
对应的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:hero="http://www.baidu.com" xmlns="http://www.163.com">
<heros>
<hero id="0">
<hero:name>超人</hero:name>
<age>92</age>
</hero>
<hero id="1">
<name>蝙蝠侠</name>
<age>86</age>
</hero>
<hero id="2">
<name>绿巨人</name>
<age>99</age>
</hero>
</heros>
</root>