简单操作XML

第一部分 什么是XML?

  XML, Extensible Markup Language ,可扩展标记语言,主要用途是描述和交换数据。它的一个用处是配置文件,用来保存数据库连接字符串、端口、IP、日志保存路径等参数。我们可以使用文本文件来保存文件,使用 key = value, key2 = value2 ,...... 的方式来保存数据。这样做的坏处是结构比较不规矩,读取起来也不方便,需要自行编写一长串的if / else 语句。为了解决这些问题,我们可以使用XML。

  XML定义了一组规则,即它的格式和操作方法。下面介绍几种基本规则:

  1、文档声明

  文档声明属于XML处理指令。如<?xml version="1.0" encoding="utf-8" ?>,说明了XML的版本和字符编码。

  2、处理指令

  处理指令以<?开始,以?>结束,用于将指令传递给XML解析器。例如<?xml-stylesheet type="text/css" href="main.css" ?>指令用于在XML中链接样式表。

  3、节点(Node),元素(Element),标记(Tag)。

  元素是节点的子集,称为元素节点,文档声明可以是文档声明节点。节点包括了XML几乎所有内容。元素是XML主要结构,元素的形式是标记。例如ip可能是一个元素,而<ip>、</ip>则是标记。

  4、有且只有一个文档元素(Document Element)。

  5、标记不能交错嵌套。

  6、标记必须闭合。可以使用单标记闭合<tag />,也可以使用两个标记来闭合<tag></tag>。

  7、大小写敏感。

  8、元素可以包含属性(Attribute)、文本(text)。

  9、预定义实体引用。

  其实就是转义符。比如<的实体引用是&lt;。

  10、CDATA

  位于CDATA中的文本不要求满足XML的规则。其格式为<tag><![CDATA[ 1<X<10]]></tag>,这里我们不需要对[]里面的<进行转义了。

  11、文档类型声明。

  格式为<!DOCTYPE rootElement>,rootElement是我们定义的根节点名称。

  12、自定义引用。

  类似于常量声明,位于文档类型声明中。格式为 : <!DOCTYPE rootElement [<!ENTITY BRUCE "布鲁斯少爷">]>。现在引用 &BRUCE; 相当于 布鲁斯少爷 了。

  13、命名空间。

  命名空间主要目的是为了避免标记重名。在自己使用自定义的XML时,几乎用不到命名空间。它的格式是 xmlns="myNamespace"。还可以给命名空间加上前缀。

  XML有可能是非法的,尽管它看起来正确。这就引入了XML有效性验证。比如说,我们有一个date属性,应该接受一个DateTime类型,结果第三方使用者却提供了一个字符串。我们可以预先定义好文档的结构、标记、属性、属性值、文本值等信息,相当于该XML的元数据,通过这个元数据来对XML进行合法性验证。这种方法也被制定成规范,包括XSD,DTD,XDR等。同样,自用自定义XML几乎用不到这些验证。

第二部分 操作XML

  先使用XMLWriter生成一个XML文档。其实直接写更方便些。

using UnityEngine;
using System.Collections;
using System.Xml;

public class GenXML : MonoBehaviour {

    void Start()
    {
        string filePath =Application.dataPath +@"\movieList.xml";

        XmlWriterSettings settings = new XmlWriterSettings ();
        settings.Encoding = System.Text.Encoding.UTF8;
        settings.Indent = true;
        settings.IndentChars = "\t";
        settings.OmitXmlDeclaration = false;
        XmlWriter writer = XmlWriter.Create (filePath, settings);

        writer.WriteStartDocument ();
        writer.WriteDocType ("movieList", null, null, null);
        writer.WriteStartElement ("movieList");
        writer.WriteComment ("新上映电影信息");

        writer.WriteStartElement ("movie");
        writer.WriteAttributeString ("id", "1");
        writer.WriteAttributeString ("title", "魔境仙踪");
        writer.WriteAttributeString ("director", "Sam`Rayme");
        writer.WriteAttributeString ("release", "2013-3-28");
        writer.WriteElementString ("starring", "james`franco");
        writer.WriteStartElement ("genreList");
        writer.WriteElementString ("genre", "冒险");
        writer.WriteElementString ("genre", "家庭");
        writer.WriteElementString ("genre", "奇幻");
        writer.WriteEndElement ();
        writer.WriteEndElement ();

        writer.WriteStartElement ("movie");
        writer.WriteAttributeString ("id", "2");
        writer.WriteAttributeString ("title", "虎胆龙威5");
        writer.WriteAttributeString ("director", "John`Moor");
        writer.WriteAttributeString ("release", "2013-3-14");
        writer.WriteElementString ("starring","BRUCE LEE");
        writer.WriteStartElement ("genreList");
        writer.WriteElementString ("genre", "动作");
        writer.WriteElementString ("genre", "犯罪");
        writer.WriteElementString ("genre", "惊悚");
        writer.WriteEndElement ();
        writer.WriteEndElement ();

        writer.WriteEndElement ();
        writer.WriteEndDocument ();
        writer.Flush ();
        writer.Close ();

    }
}

  这就是生成的XML文档;

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE movieList>
<movieList>
    <!--新上映电影信息-->
    <movie id="1" title="魔境仙踪" director="Sam`Rayme" release="2013-3-28">
        <starring>james`franco</starring>
        <genreList>
            <genre>冒险</genre>
            <genre>家庭</genre>
            <genre>奇幻</genre>
        </genreList>
    </movie>
    <movie id="2" title="虎胆龙威5" director="John`Moor" release="2013-3-14">
        <starring>BRUCE LEE</starring>
        <genreList>
            <genre>动作</genre>
            <genre>犯罪</genre>
            <genre>惊悚</genre>
        </genreList>
    </movie>
</movieList>

  使用XMLReader读取所有节点:

using UnityEngine;
using System.Collections;
using System.IO;
using System.Xml;

public class ReadXML : MonoBehaviour {

    void Start(){
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.IgnoreWhitespace = true;
        settings.ProhibitDtd = false;

        string filePath =Application.dataPath +@"\movieList.xml";
        XmlReader reader = XmlReader.Create (filePath, settings);

        while(reader.Read())
        {
            string indent = new string(‘ ‘,reader.Depth*3);
            string line = string.Format("{0}{1} | {2} - {3}",indent,reader.NodeType,reader.Name,reader.Value);
            Debug.Log(line);
            line = "";
            if(reader.NodeType==XmlNodeType.Element&&reader.HasAttributes){
                for (int i = 0; i < reader.AttributeCount; i++) {
                    reader.MoveToAttribute(i);
                    line+=string.Format("{0}[{1} , {2}]\r\n",indent,reader.Name,reader.Value);
                }
                Debug.Log(line);
            }
        }
        reader.Close ();
    }
}

  使用XMLDocument为XML文档增加一些新内容。

//使用XMLDocument修改XML
        XmlDocument xdoc = new XmlDocument ();
        xdoc.Load (filePath);
        XmlElement movie = xdoc.CreateElement ("movie");
        XmlAttribute attr = xdoc.CreateAttribute ("id");
        attr.Value = "4";
        movie.Attributes.Append (attr);

        attr = xdoc.CreateAttribute ("title");
        attr.Value = "电锯惊魂";
        movie.Attributes.Append (attr);

        attr = xdoc.CreateAttribute ("director");
        attr.Value = "ROCK MAN";
        movie.Attributes.Append (attr);

        attr = xdoc.CreateAttribute ("release");
        attr.Value = "2013-4-12";
        movie.Attributes.Append (attr);

        XmlElement starring = xdoc.CreateElement ("starring");
        starring.InnerText = "DICK Fur";
        movie.AppendChild (starring);

        XmlElement genreList = xdoc.CreateElement ("genreList");
        XmlElement genre = xdoc.CreateElement ("genre");
        genre.InnerText = "恐怖";
        genreList.AppendChild (genre);

        genre = xdoc.CreateElement ("genre");
        genre.InnerText = "血腥";
        genreList.AppendChild (genre);

        movie.AppendChild(genreList);

        XmlElement root = xdoc.DocumentElement;
        root.AppendChild(movie);
        xdoc.Save (Application.dataPath+@"\movieList2.xml");

  这是新添加的部分。

<movie id="4" title="电锯惊魂" director="ROCK MAN" release="2013-4-12">
    <starring>DICK Fur</starring>
    <genreList>
      <genre>恐怖</genre>
      <genre>血腥</genre>
    </genreList>
  </movie>

  使用XPath访问并修改XML节点。

//使用XPath访问XML节点
        XmlDocument xmlDoc = new XmlDocument ();
        xmlDoc.Load (filePath);

        XmlElement root = xmlDoc.DocumentElement;
        XmlNode movie = root.SelectSingleNode ("movie[@id=2]");
        XmlNode titleAttr = movie.SelectSingleNode ("@title");
        titleAttr.Value = "龙胆虎威8:叱咤风云";

        XmlNode starring = movie.SelectSingleNode ("starring");
        starring.InnerText = starring.InnerText + "/Youth Gill";

        XmlNode genre = movie.SelectSingleNode ("genreList/genre[3]");
        XmlNode genreList = movie.SelectSingleNode ("genreList");
        genreList.RemoveChild (genre);

        xmlDoc.Save (Application.dataPath +@"\movieList3.xml");

  这是修改后的内容。

  <movie id="2" title="龙胆虎威8:叱咤风云" director="John`Moor" release="2013-3-14">
    <starring>BRUCE LEE/Youth Gill</starring>
    <genreList>
      <genre>动作</genre>
      <genre>犯罪</genre>
    </genreList>
  </movie>

  此外,还可以对XML进行验证和转换。因为用的不多,就不写了。

时间: 2024-08-28 03:27:22

简单操作XML的相关文章

Linq To XML 简单操作

加载xml文件和保存xml文件 XDocument doc = XDocument.Load(Server.MapPath("\\xmlfile\\Book.xml")); doc.Save(Server.MapPath("\\xmlfile\\BookBackup.xml")); 创建元素 XElement xe = new XElement("book",new XElement("bookname","asp.

SqlServer简单的操作XML以及SQl的 try catch等统一格式

1:SqlServer简单的操作XML: ALTER PROCEDURE [dbo].[SP_CRM_FranchiseeRecharge_Money] @Create_By VARCHAR(50), @xmlStr1 NVARCHAR(MAX) -写在这里面的为 传入的参数 AS BEGIN as begin后面的为自定义的变量 SET NOCOUNT ON; DECLARE @xml XML = @xmlStr1; sqlserver操作XML T-SQL提供了以下几个针对XML类型的查询函

转载:用Ant操作XML文件

1.14 用XMLTask操作XML(1) 本节作者:Brian Agnew 对于简单的文本搜索和替换操作,Ant的<replace>任务就够用了,但在现代Java框架中,用户更可能需要强大的XML操作能力来修改servlet描述符.Spring配置等. XMLTask是Ant外部任务,它提供了强大的XML编辑工具,主要用于在构建/部署过程中创建和修改XML文件. 使用XMLTask的好处如下? 与Ant的<replace>任务不同,XMLTask使用XPath提供识别XML文档各

C#操作XML增删改查

XML文件是一种常用的文件格式,不管是B/S还是C/S都随处可见XML的身影.Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具.XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用.微软也提供了一系列类库来倒帮助我们在应用程序中存储XML文件. “在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型

delphi操作xml学习笔记 之一 入门必读

Delphi 对XML的支持---TXMLDocument类 Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocument把XML文档读到内存中,从而可以进行编辑.保存操作.TXMLDocument类是通过DOM(文档对象模型)接口来访问XML文档中的各个元素的.对于DOM接口的实现有多种方式,Delphi支持的方式有:1)微软的MSXML SDK,这种方式是通过COM对象来实现:2) Apache 的Xerces的实现方式

Delphi 操作 XML(一)

一.欢迎 本帮助文件提供从SimDesign BV的NativeXml组件的信息. 二.购买NativeXml! NativeXml现在是开源的,但支持是仅专门适用于购买NativeXml的客户. 您可以通过此链接购买NativeXml:http://www.simdesign.nl/xml.html 价格:29.95欧元 采购NativeXml的优势: 两年的通过电子邮件或特殊的"NativeXml Source"论坛支持,接收测试和修正,并从"NativeXml Sour

C#操作XML学习(一)

一.简单介绍 using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml.Load(path); xml.Load(HttpContext.Current.Server.MapPath("~/file/bookstore.xml")); //指定一个节点 XmlNode root=xml.SelectSingleNode("/root"); //获取节点下所有直接

Java操作XML的JAXB工具

在java中操作XML的工作中中,比较方便的工具是JAXB(Java Architecture for XML Binding). 利用这个工具很方便生成XML的tag和Java类的对应关系.参照网上的资料,简单说明一下java操作xml的一些东西. 1.先定义一个XML Schema文件.比如: [html] view plain copy print? <?xml version="1.0" encoding="UTF-8" standalone=&quo

java操作XML文件

XML文件可以用来作为一种小型数据库存在,但更多时候在项目中都是用来当成配置文件用的,也就避免不了对XML文件的增上改查操作. 在java中,解析XML文件的方式大致分为两种:DOM解析,SAX解析 先来说DOM解析方式:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容. 用的较为多的是Dom4j工具(非官方)解析,简单介绍下Dom4j的使用,具体API文档请下载