xml在u3d的使用[u3d_rpg游戏开发之物品管理(四)]

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u3d_20171030/article/details/78811481

暂停一时间之后的另一种全新而又实用的东西

1. 声明

就是在xml文档开头处写明这一行,有时候没写也不会出错
<?xml version="1.0" encoding="utf-8"?>

2. 根节点

跟节点的只能有一个,位于最外层,是xml文档的第二个结点,第一个结点是声明时候的那行(如果有声明的话)

3. 注释

注释方法为
<!--注释内容-->
一般最好不要写在根节点里面,会被当成一个子节点,都是写在这个之间,如下代码总结前三点,也就是xml里面的框架了
<?xml version="1.0" encoding="utf-8"?>
<!--装备的xml-->
<Equips>
</Equips>

4. 头文件

这里通过vs用c#语言读取,需要引入头文件
using System.Xml;

5. Xml文档类

先新建一个xml文档类,可用来接收物理地址的xml文档
        //创建xml文档
        XmlDocument doc = new XmlDocument();

6. 获取物理内存的xml文档

需要使用绝对路径的地址来获取文档
a.这里使用Application.dataPath方法返回到Assets文件的绝对路径
b.再加上Assets文件下的路径就可以了,我这里的文档是直接放在Assets目录下的我的xml文档名字就是"Equart.xml"
        //创建xml文档
        XmlDocument doc = new XmlDocument();
        //获取xml文件
        doc.Load(Application.dataPath + "/Equart.xml");

7. 获取根节点

有了整个文档,就可以通过各种方法获取其中的各种值了.
首先是获取根结点,可以通过以下两种方法获取
doc.LastChild//返回最后一个结点
doc.FirstChild//返回第一个结点
使用第一个方法返回的就正是根结点,在第2点的时候本文提到过了

8. 元素类

有了第7点的返回结点的方法,当然是要新建一个XmlDocument类的实例来接收,其实不然,我们用一个元素类XmlElement来接收,因为元素类提供了更多的方法让我们对这个结点进行操作,其实,元素类就是继承至结点类的.
        //创建xml文档
        XmlDocument doc = new XmlDocument();
        //获取xml文件
        doc.Load(Application.dataPath + "/Equart.xml");
        //获取根结点
        XmlElement equipInformation = doc.LastChild as XmlElement;

9. 获取所有子节点

有了根结点,就可以做很多事情了,比如获取其子结点:
equipInformation.ChildNodes;//返回的是equipInformation下的所有子节点
没错,上面的方法返回的是一个数组所以接收的时候我们也可以用一个结点数组来储存(下文重点提到),还有就是可以直接用foreach去遍历它
foreach(XmlElement xet in equipInformation.ChildNodes)
{
    //这里就可以通过各种方法再对获取的结点进行各种操作了
}

10. 获取结点的属性值

从这里开始就要开始获取我们正真需要用到的东西了,比如这个结点的某个属性值.属性是什么?这里加强一下,上代码:
<?xml version="1.0" encoding="utf-8"?>
<!--装备的xml-->
<Equips>
  <Equip id="2001">
    <name>黄金甲</name>
    <iconName>armor()_icon</iconName>
    <objectInfor>Equip</objectInfor>
    <addDamageValue>0</addDamageValue>
    <addDefenseValue>50</addDefenseValue>
    <addSpeedValue>0</addSpeedValue>
    <typeOfWear>Armor</typeOfWear>
    <applicableOccupation>Swordman</applicableOccupation>
    <priceSell>150</priceSell>
    <priceBuy>200</priceBuy>
  </Equip>
  <Equip id="2002">
    <name>铜甲</name>
    <iconName>armor1-icon</iconName>
    <objectInfor>Equip</objectInfor>
    <addDamageValue>0</addDamageValue>
    <addDefenseValue>39</addDefenseValue>
    <addSpeedValue>0</addSpeedValue>
    <typeOfWear>Armor</typeOfWear>
    <applicableOccupation>Swordman</applicableOccupation>
    <priceSell>100</priceSell>
    <priceBuy>150</priceBuy>
  </Equip>
</Equips>
这就是我做装备的xml文档的一个小部分,两件装备的所有信息,想知道这些都是具体啥信息,只需要知道那些英文名字的结点名是什么意思就懂了,这个不是重点,所以略过,好了,这里的 

id=”2001” 就是属性,是结点的属性,id是属性名,2001是属性值
我们可以用XmlElement.GetAttribute方法获取某个属性的值,结合之前所有的方法就可以获取知道这两件装备的属性值了

        //创建xml文档
        XmlDocument doc = new XmlDocument();
        //获取xml文件
        doc.Load(Application.dataPath + "/Equart.xml");
        //获取根结点
        XmlElement equipInformation = doc.LastChild as XmlElement;
        //遍历根结点下的所有子结点
        foreach(XmlElement xet in equipInformation.ChildNodes)
        {
            Debug.Log(xet.GEtAttribute("id"));
        }
u3d里面就会输出两行,2001和2002

11. 根据索引获取子节点

使用equipInformation.ChildNodes[index]返回第index个子节点,注意,返回的是一个结点
        equipInformation.ChildNodes[1];
返回的就是<Name></Name>这个结点.注意xml的索引是从1开始的

12. 获取节点下的具体的内容

主要使用InnerText来获取里面的文本,结合之前知识点:
        //创建xml文档
        XmlDocument doc = new XmlDocument();
        //获取xml文件
        doc.Load(Application.dataPath + "/Equart.xml");
        //获取根结点
        XmlElement equipInformation = doc.LastChild as XmlElement;
        //遍历根结点下的所有子结点
        foreach(XmlElement xet in equipInformation.ChildNodes)
        {
            Debug.Log(xet.ChildNodes[1].InnerText);
        }
输出两行:黄金甲和铜甲.
经历波折,终于获取到里面我们需要的任何信息了.而第13点则是通过真正方便的方法来获取我们需要的东西,呵呵,如果有前面的基础,学起第13点才是很容易理解的.


13. XPath解析

这中XPath解析不仅仅是用在xml,白度就知道了,很多都可以用XPath解析.
所以这个解析才是正真使用的东西,乃本文核心

(1)查找单个结点

doc.SelectSingleNode("字符串表达式");
    返回查找到的第一个结点,注意,我用的是结点类的doc,不是元素类的.
    注意:查找单个结点用的这个方法返回的是查找到的第一个结点,而不是说:"返回一个结点",也就是说,有可能根据字符串表达式有可能会查找到多个,但是只是返回第一个.
    这里的"字符串表达式"是重点,根据表达式的不同返回不同的内容.后面会重点解释.

(2)查找多个结点

doc.SelectNodes("字符串表达式");
    返回查找到的所有结点,是一个数组.
  • 字符串表达式:
    一、绝对路径:
"/Equips/Equip/name"//这里用的是单斜杠
查找到Equips根结点下的Equip结点的name结点

二、相对路径:

"//name"//这里用的是双斜杠
遍历所有结点,查找到结点名为"name"的结点,绝对路劲和相对路径是可以配合的:
"/Equips//name"
遍历/Equips下的所有结点,找到名为"name"的结点

注意:并不是单斜杠就只查找一个结点,双斜杠就遍历所有结点这样区分,而是根据上面提到的两个方法,表达式放在不同的方法,返回的内容是一个或多个
三、索引

"/Equips/Equip[2]"//这里用的是中括号
查找到Equips结点下的第二个叫做"Equip"的结点,注意索引依然是从1开始的
这种格式的还有两种查询方式,就是:
"/Equips/Equip[last()]"//查找到最后一个结点
"/Equips/Equip[last()-1]"//查找到倒数第二个结点

四、属性

"/Equips/Equip[@id=2002]"//在中括号里加入了@符号,注意2002不需要用引号
查找到Equips结点下id=2002的Equip结点

下面举实例:


        //创建xml文档
        XmlDocument doc = new XmlDocument();
        //获取物理内存的xml文件
        doc.Load(Application.dataPath + "/Equart.xml");
        //根据id查找结点
        XmlNode iconNode = doc.SelectSingleNode("/Equips/Equip[@id=2002]/iconName");
        Debug.Log(iconNode.InnerText);
输出:armor1-icon
其实在起作用在查找的只有第三句代码,找到Equips节点下id=2002的Equip结点的iconName结点
之一行代码就能拿到我们所需要的任何信息,所以这是比较推荐使用的方法!

猜你喜欢

转载自blog.csdn.net/u3d_20171030/article/details/78811481