using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;/*----------------------------------------------------------------
// Copyright (C) 2017
//
// 模块名:轻量级XML工具
// 创建者:Cheng
// 修改者列表:
// 创建日期:2/28/2017
// 模块描述:
//----------------------------------------------------------------*/
namespace Garson
{public class XML{private XmlNode root;public XML() { }public XML(string xml){Parse(xml);}/// <summary>/// 从根节点获取Element/// </summary>/// <param name="path">路径,eg:"Root/Node/Element"</param>/// <returns></returns>public XmlNode GetElement(string path){string[] paths = path.Split('/');var p = root;for (int i = 0; i < paths.Length; i++){p = p.GetElement(paths[i]);if(p == null)break;}return p;}/// <summary>/// 在指定节点下插入新元素/// </summary>/// <param name="path">如果path为空则插入在根节点</param>/// <param name="name">新节点名称</param>/// <returns></returns>public XmlNode AddNode(string path, string name){if(root == null)root = new XmlNode();if (string.IsNullOrEmpty(path)){XmlNode node = new XmlNode {name = name};root.AddChild(node);return node;}else{var parent = GetElement(path);if (parent == null){Debug.LogError("Error: Cannot find path:" + path);return null;}XmlNode node = new XmlNode();node.name = name;parent.AddChild(node);return node;}}/// <summary>/// 在指定路径下插入新节点/// </summary>/// <param name="path">如果路径不存在,会创建相应的节点</param>/// <param name="name">新节点名称</param>/// <returns></returns>public XmlNode AddNodeIgnorePath(string path, string name){if (root == null)root = new XmlNode();string[] paths = path.Split('/');var p = root;for (int i = 0; i < paths.Length; i++){var c = p.GetElement(paths[i]);if (p == null){c = new XmlNode(){name = paths[i]};p.AddChild(c);}p = c;}var node = new XmlNode(){name = name};p.AddChild(node);return node;}/// <summary>/// 添加属性/// </summary>/// <param name="path">该路径下的节点</param>/// <param name="key">属性名</param>/// <param name="value">属性值</param>/// <returns></returns>public bool AddAttribute(string path, string key, string value){var p = GetElement(path);if (p == null) return false;p.AddAttribute(key, value);return true;}public override string ToString(){return Print();}/// <summary>/// 把XML转化成字符串/// </summary>/// <returns></returns>public string Print(){StringBuilder stringBuilder = new StringBuilder();stringBuilder.AppendLine("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");var elements = root.GetElements();foreach (var element in elements){BuildString(stringBuilder, element, 0);}return stringBuilder.ToString();}/// <summary>/// 递归调用/// </summary>/// <param name="stringBuilder"></param>/// <param name="element"></param>/// <param name="tab">每行前加制表符个数</param>private void BuildString(StringBuilder stringBuilder, XmlNode element, int tab){for (int i = 0; i < tab; i++){stringBuilder.Append("\t");}stringBuilder.Append("<");stringBuilder.Append(element.name);if (element.HasAttribute()){stringBuilder.Append(" ");var attrs = element.GetAttributes();foreach (var key in attrs.Keys){stringBuilder.Append(key);stringBuilder.Append("=\"");stringBuilder.Append(attrs[key]);stringBuilder.Append("\" ");}}if (element.HasChild()){stringBuilder.AppendLine(">");var childern = element.GetElements();foreach (var child in childern){BuildString(stringBuilder, child, tab+1);}for (int i = 0; i < tab; i++){stringBuilder.Append("\t");}stringBuilder.AppendLine("</" + element.name + ">");}else if (!string.IsNullOrEmpty(element.text)){stringBuilder.Append(">");stringBuilder.Append(element.text);stringBuilder.AppendLine("</" + element.name + ">");}else{stringBuilder.AppendLine(" />");}}private const char LT = '<';private const char GT = '>';private const char DASH = '-';private const char SPACE = ' ';private const char QUOTE = '"';private const char SLASH = '/';private const char QMARK = '?';private const char EQUALS = '=';private const char EXCLAMATION = '!';private enum ElementType{/// <summary>/// 元标签/// </summary>METATAG,/// <summary>/// 注释/// </summary>COMMENT,/// <summary>/// 声明/// </summary>DOCTYPE,/// <summary>/// 字符数据/// </summary>CDATA,/// <summary>/// 空/// </summary>NONE,}/// <summary>/// Xml解析,会覆盖已存在的XML/// </summary>/// <param name="xml"></param>public void Parse(string xml){if(string.IsNullOrEmpty(xml))return;xml = xml.Replace("\n", " ");root = new XmlNode();ElementType cType = ElementType.NONE;char c; //current charchar cp; //c previouschar cn; //c nextchar cnn; // c next nextStack<XmlNode> xmlStack = new Stack<XmlNode>();xmlStack.Push(root);int length = xml.Length;bool collectingName = false;bool collectingAttribute = false;string name = "";string attr = "";for (int i = 0; i < length; i++){c = cp = cn = cnn = '\0';c = xml[i];if (i > 0) cp = xml[i - 1];if (i + 1 < length) cn = xml[i + 1];if (i + 2 < length) cnn = xml[i + 2];if (cType == ElementType.NONE){if (c == LT){if (xmlStack.Count > 0){if (!string.IsNullOrEmpty(name.Trim()))// top ele's text eg.<aa>****</aa>{var node = xmlStack.Peek();node.text = name.Trim();}}name = "";if (cn == QMARK)//<?*****?>{cType = ElementType.METATAG;i++;continue;}if (cn == EXCLAMATION && cnn == DASH)//<!-->{cType = ElementType.COMMENT;i++;continue;}if (cn == EXCLAMATION)//<![[*******>{cType = ElementType.DOCTYPE;i++;continue;}if (cn == SLASH)//</***>{cType = ElementType.CDATA;continue;}//create newcType = ElementType.CDATA;collectingName = false;collectingAttribute = false;name = "";attr = "";XmlNode xmlNode = new XmlNode();if (xmlStack.Count > 0){var parent = xmlStack.Peek();parent.AddChild(xmlNode);}xmlStack.Push(xmlNode);continue;}else{name += c;}}if (cType == ElementType.METATAG){if (c == QMARK && cn == GT){i++;cType = ElementType.NONE;continue;}elsecontinue;}if (cType == ElementType.COMMENT){if (c == DASH && cn == DASH && cnn == GT){i += 2;cType = ElementType.NONE;continue;}elsecontinue;}if (cType == ElementType.DOCTYPE){if (c == GT) cType = ElementType.NONE;continue;}if (cType == ElementType.CDATA){if (collectingName){if (c == SPACE || c == GT){var node = xmlStack.Peek();if (string.IsNullOrEmpty(node.name)){node.name = name.Trim();collectingName = false;name = "";}if (c == GT){cType = ElementType.NONE;continue;}}else if (c == SLASH && cn == GT){var node = xmlStack.Peek();node.name = name.Trim();collectingName = false;cType = ElementType.NONE;name = "";i++;xmlStack.Pop();continue;}else if (c == EQUALS){if (cn == QUOTE){collectingName = false;collectingAttribute = true;attr = "";i++;continue;}elseDebug.LogError("Error: Attribute '\"' is not near '=' in char index:" + i );}else{name += c;}}else if(collectingAttribute){if (c == QUOTE){collectingAttribute = false;var node = xmlStack.Peek();node.AddAttribute(name.Trim(), attr);name = "";attr = "";}else{attr += c;}}else{if(c == SPACE) continue;if (c == GT){cType = ElementType.NONE;continue;}if (c == SLASH && cn == GT){cType = ElementType.NONE;xmlStack.Pop();i++;continue;}if (c == SLASH){name = "";int j = i + 1;for (; j < length; j++){if (xml[j] == GT){break;}else{name += xml[j];}}var node = xmlStack.Peek();if (node.name.Equals(name)){xmlStack.Pop();}else{Debug.LogError("Error: current is /, name is "+ name + ", but top node name is "+ node.name );}i = j;cType = ElementType.NONE;name = "";continue;}name += c;collectingName = true;}}}}}public class XmlNode{public string text { get; set; }public string name { get; set; }private List<XmlNode> children;private Dictionary<string, string> attributes;public XmlNode(){children = new List<XmlNode>();attributes = new Dictionary<string, string>();name = string.Empty;text = string.Empty;}public bool HasChild(){return children.Count > 0;}public bool HasAttribute(){return attributes.Count > 0;}public void AddChild(XmlNode child){children.Add(child);}/// <summary>/// 移除子节点/// </summary>/// <param name="index">从0开始的下标</param>/// <returns></returns>public XmlNode RemoveChild(int index){if (children.Count > index){var node = children[index];children.RemoveAt(index);return node;}return null;}/// <summary>/// 添加属性,已存在则会覆盖/// </summary>/// <param name="key"></param>/// <param name="value"></param>public void AddAttribute(string key, string value){if (attributes.ContainsKey(key))attributes[key] = value;elseattributes.Add(key, value);}public void RemoveAttribute(string key){attributes.Remove(key);}/// <summary>/// 获取节点/// </summary>/// <param name="index">从0开始的下标</param>/// <returns></returns>public XmlNode GetElement(int index){if (children.Count > index)return children[index];return null;}public XmlNode GetElement(string cname){foreach (var child in children){if (child.name.Equals(cname))return child;}return null;}public List<XmlNode> GetElements(){return children;}public string GetAttribute(string key){if (attributes.ContainsKey(key))return attributes[key];return string.Empty;}public Dictionary<string, string> GetAttributes(){return attributes;}public string[] GetAttributeArray(string key){string value = GetAttribute(key);return value.Split(',');}}
}

轻量级的XML解析生成工具,具体使用如注释, 可能会有坑,但是我自己还没遇到。

XML 解析生成工具相关推荐

  1. (十一)XML 文件解析以及工具实现(详解)

    XML 文件解析详解以及工具实现 文章目录 XML 文件解析详解以及工具实现 前言 解析 XML 文档 XML 解析器与 W3C XML 的层次结构 XML 解析工具化 工具化分析 本地块与静态本地块 ...

  2. Java XML解析工具 dom4j介绍及使用实例

    Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...

  3. Java XML解析工具 JDOM介绍及使用实例

    Java XML解析工具 JDOM JDOM介绍 JDOM是一种使用XML的独特Java工具包,用于快速开发XML应用程序. 它的设计包含Java语言的语法乃至语义. JDOM是一个开源项目,它基于树 ...

  4. java xml开源操作类,xml解析和操作的开源工具项目涵盖java c++ php 等语言

    XML解析器-Xerces    XML操作库-dom4j    XML文档解析器-Digester    J2ME-的XML-解析器-kXML XML解析类库-MXP1    XML解析器-LibX ...

  5. xml工具生成工具_研究当前的XML工具

    xml工具生成工具 常用缩略语 API:应用程序编程接口 DITA:达尔文信息键入体系结构 DTD:文档类型定义 HTML:超文本标记语言 IDE:集成开发环境 URL:统一资源定位符 W3C:万维网 ...

  6. Java XML解析工具类

    Java XML解析工具类 Java解析XML的方式有很多,这里不一一说明了,利用三方jar包,实现了一个XML工具类 本身是有个需求,讲三方公司的XML请求文件中的Response里的属性赋值成ja ...

  7. mysql xml生成工具_自动生成po、dao、xml 工具:mybatis-generator

    需要注意:文件路径关系,xml路径,jar包路径,以及xml中生成文件的路径等. 由于MyBatis属于一种半自动的ORM框架,所以主要的工作将是书写Mapping映射文件,但是由于手写映射文件很容易 ...

  8. php获得帮助类数据_PHP解析xml格式数据工具类示例

    本文实例讲述了PHP解析xml格式数据工具类.分享给大家供大家参考,具体如下: class ome_xml { /** * xml资源 * * @var resource * @see xml_par ...

  9. linux 进程间通信 dbus-glib【实例】详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

最新文章

  1. step如何打开服务器项目,STEP7项目打开及删除
  2. jQuery之替换节点
  3. spring-aop入门
  4. JavaScript(循环)
  5. 大数据 机器学习 算法概论
  6. Vim使用技巧:撤销与恢复撤销
  7. 腾讯-视频打标签算法探讨
  8. RMAN备份学习笔记
  9. Windows服务器常用命令
  10. [pl-slam] 几个重要的参数属性
  11. Python的Cython在Windows环境下的部署安装
  12. R语言常用数据文件的导入
  13. 74LS系列芯片简记——20-30
  14. 37,字节跳动Python面试
  15. 计算机重做系统 d盘,重装系统后c盘变成d盘怎么办|pe装系统c盘变d盘解决方法
  16. 任正非《以客户为中心》
  17. 那些口碑炸裂的免费远程控制软件!
  18. 帝国cms生成动态php栏目,帝国cms怎么实现页面自动生成html
  19. 再见2020,你好2021(2020年度总结)
  20. Unity SKFramework框架(二十五)、RSA算法加密、签名工具 RSA Crypto

热门文章

  1. 2月国内外CTF比赛时间汇总来了!
  2. idea debug 第二次进不去断点问题
  3. 模仿QQ,实现列表简单折叠
  4. 【​观察】数字经济时代的联接革命 新华三用场景化谋求破局
  5. 10系统连服务器,客户端装的win10系统,连接不了不服务器。怎么设置才能连通...
  6. Partial Dependence Plots —— 部分依赖图_特征如何影响模型预测
  7. linux tail命令语法
  8. MySQL 数据库 User表权限以及用户授权详解
  9. linux如何手动kill vnc端口并修改分辨率
  10. 珍惜能在公司上班的每一天——2022年个人工作总结