XML 解析生成工具
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 解析生成工具相关推荐
- (十一)XML 文件解析以及工具实现(详解)
XML 文件解析详解以及工具实现 文章目录 XML 文件解析详解以及工具实现 前言 解析 XML 文档 XML 解析器与 W3C XML 的层次结构 XML 解析工具化 工具化分析 本地块与静态本地块 ...
- Java XML解析工具 dom4j介绍及使用实例
Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...
- Java XML解析工具 JDOM介绍及使用实例
Java XML解析工具 JDOM JDOM介绍 JDOM是一种使用XML的独特Java工具包,用于快速开发XML应用程序. 它的设计包含Java语言的语法乃至语义. JDOM是一个开源项目,它基于树 ...
- java xml开源操作类,xml解析和操作的开源工具项目涵盖java c++ php 等语言
XML解析器-Xerces XML操作库-dom4j XML文档解析器-Digester J2ME-的XML-解析器-kXML XML解析类库-MXP1 XML解析器-LibX ...
- xml工具生成工具_研究当前的XML工具
xml工具生成工具 常用缩略语 API:应用程序编程接口 DITA:达尔文信息键入体系结构 DTD:文档类型定义 HTML:超文本标记语言 IDE:集成开发环境 URL:统一资源定位符 W3C:万维网 ...
- Java XML解析工具类
Java XML解析工具类 Java解析XML的方式有很多,这里不一一说明了,利用三方jar包,实现了一个XML工具类 本身是有个需求,讲三方公司的XML请求文件中的Response里的属性赋值成ja ...
- mysql xml生成工具_自动生成po、dao、xml 工具:mybatis-generator
需要注意:文件路径关系,xml路径,jar包路径,以及xml中生成文件的路径等. 由于MyBatis属于一种半自动的ORM框架,所以主要的工作将是书写Mapping映射文件,但是由于手写映射文件很容易 ...
- php获得帮助类数据_PHP解析xml格式数据工具类示例
本文实例讲述了PHP解析xml格式数据工具类.分享给大家供大家参考,具体如下: class ome_xml { /** * xml资源 * * @var resource * @see xml_par ...
- linux 进程间通信 dbus-glib【实例】详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)
linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...
最新文章
- step如何打开服务器项目,STEP7项目打开及删除
- jQuery之替换节点
- spring-aop入门
- JavaScript(循环)
- 大数据 机器学习 算法概论
- Vim使用技巧:撤销与恢复撤销
- 腾讯-视频打标签算法探讨
- RMAN备份学习笔记
- Windows服务器常用命令
- [pl-slam] 几个重要的参数属性
- Python的Cython在Windows环境下的部署安装
- R语言常用数据文件的导入
- 74LS系列芯片简记——20-30
- 37,字节跳动Python面试
- 计算机重做系统 d盘,重装系统后c盘变成d盘怎么办|pe装系统c盘变d盘解决方法
- 任正非《以客户为中心》
- 那些口碑炸裂的免费远程控制软件!
- 帝国cms生成动态php栏目,帝国cms怎么实现页面自动生成html
- 再见2020,你好2021(2020年度总结)
- Unity SKFramework框架(二十五)、RSA算法加密、签名工具 RSA Crypto
热门文章
- 2月国内外CTF比赛时间汇总来了!
- idea debug 第二次进不去断点问题
- 模仿QQ,实现列表简单折叠
- 【​观察】数字经济时代的联接革命 新华三用场景化谋求破局
- 10系统连服务器,客户端装的win10系统,连接不了不服务器。怎么设置才能连通...
- Partial Dependence Plots —— 部分依赖图_特征如何影响模型预测
- linux tail命令语法
- MySQL 数据库 User表权限以及用户授权详解
- linux如何手动kill vnc端口并修改分辨率
- 珍惜能在公司上班的每一天——2022年个人工作总结