XML 文档解析操作
sing System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.Collections;
using System.IO;
public class XMLHealper
{
构造函数#region 构造函数
public XMLHealper()
{
FilePath = XMLPath.GetXMLPath();
OpenXML();
}
#endregion
对象定义#region 对象定义
private XmlDocument xmlDoc = new XmlDocument();
XmlNode xmlnode;
XmlElement xmlelem;
#endregion
属性定义#region 属性定义
private string errorMess;
public string ErrorMess
{
get { return errorMess; }
set { errorMess = value; }
}
private string filePath;
public string FilePath
{
set { filePath = value; }
get { return filePath; }
}
#endregion
加载XML文件,创建操作对象#region 加载XML文件,创建操作对象
/**//// <summary>
/// 加载XML文件,创建操作对象
/// </summary>
public void OpenXML()
{
try
{
if (!string.IsNullOrEmpty(FilePath))
{
xmlDoc.Load(filePath);
}
else
{
FilePath = string.Format(@"D:\\XMLExample.xml"); //默认路径
xmlDoc.Load(filePath);
}
}
catch (Exception ex)
{
ErrorMess = ex;
}
}
#endregion
创建Xml 文档#region 创建Xml 文档
/**//// <summary>
/// 创建一个带有根节点的Xml 文件
/// </summary>
/// <param name="FileName">Xml 文件名称</param>
/// <param name="rootName">根节点名称</param>
/// <param name="Encode">编码方式:gb2312,UTF-8 等常见的</param>
/// <param name="DirPath">保存的目录路径</param>
/// <returns></returns>
public bool CreatexmlDocument(string FileName, string rootName, string Encode)
{
try
{
XmlDeclaration xmldecl;
xmldecl = xmlDoc.CreateXmlDeclaration("1.0", Encode, null);
xmlDoc.AppendChild(xmldecl);
xmlelem = xmlDoc.CreateElement("", rootName, "");
xmlDoc.AppendChild(xmlelem);
xmlDoc.Save(FileName);
return true;
}
catch (Exception e)
{
return false;
}
}
#endregion
得到数据表#region 得到数据表
/**//// <summary>
/// 得到数据表
/// </summary>
/// <returns></returns>
public DataView GetData()
{
xmlDoc = new XmlDocument();
DataSet ds = new DataSet();
StringReader read = new StringReader(xmlDoc.SelectSingleNode(FilePath).OuterXml);
ds.ReadXml(read);
return ds.Tables[0].DefaultView;
}
#endregion
读取指定节点的指定属性值#region 读取指定节点的指定属性值
/**//// <summary>
/// 功能:
/// 读取指定节点的指定属性值
/// </summary>
/// <param name="strNode">节点名称(相对路径://+节点名称)</param>
/// <param name="strAttribute">此节点的属性</param>
/// <returns></returns>
public string GetXmlNodeValue(string strNode, string strAttribute)
{
string strReturn = "";
try
{
//根据指定路径获取节点
XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode);
//获取节点的属性,并循环取出需要的属性值
XmlAttributeCollection xmlAttr = xmlNode.Attributes;
for (int i = 0; i < xmlAttr.Count; i++)
{
if (xmlAttr.Item(i).Name == strAttribute)
{
strReturn = xmlAttr.Item(i).Value;
}
}
}
catch (XmlException xmle)
{
throw xmle;
}
return strReturn;
}
#endregion
读取指定节点的值#region 读取指定节点的值
/**//// <summary>
/// 读取指定节点的值
/// </summary>
/// <param name="strNode">节点名称</param>
/// <returns></returns>
public string GetXmlNodeValue(string strNode)
{
string strReturn = String.Empty;
try
{
//根据路径获取节点
XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode);
strReturn = xmlNode.InnerText;
}
catch (XmlException xmle)
{
System.Console.WriteLine(xmle.Message);
}
return strReturn;
}
#endregion
获取XML文件的根元素#region 获取XML文件的根元素
/**//// <summary>
/// 获取XML文件的根元素
/// </summary>
public XmlNode GetXmlRoot()
{
return xmlDoc.DocumentElement;
}
#endregion
获取XML节点值#region 获取XML节点值
/**//// <summary>
/// 获取XML节点值
/// </summary>
/// <param name="nodeName"></param>
/// <returns></returns>
public string GetNodeValue(string nodeName)
{
xmlDoc = new XmlDocument();
xmlDoc.Load(FilePath);
XmlNodeList xnl = xmlDoc.ChildNodes;
foreach (XmlNode xnf in xnl)
{
XmlElement xe = (XmlElement)xnf;
XmlNodeList xnf1 = xe.ChildNodes;
foreach (XmlNode xn2 in xnf1)
{
if (xn2.InnerText == nodeName)
{
XmlElement xe2 = (XmlElement)xn2;
return xe2.GetAttribute("value");
}
}
}
return null;
}
#endregion
设置节点值#region 设置节点值
/**//// <summary>
/// 功能:
/// 设置节点值
/// </summary>
/// <param name="strNode">节点的名称</param>
/// <param name="newValue">节点值</param>
public void SetXmlNodeValue(string xmlNodePath, string xmlNodeValue)
{
try
{
//根据指定路径获取节点
XmlNode xmlNode = xmlDoc.SelectSingleNode(xmlNodePath);
//设置节点值
xmlNode.InnerText = xmlNodeValue;
}
catch (XmlException xmle)
{
throw xmle;
}
}
#endregion
添加父节点#region 添加父节点
/**//// <summary>
/// 在根节点下添加父节点
/// </summary>
public void AddParentNode(string parentNode)
{
XmlNode root = GetXmlRoot();
XmlNode parentXmlNode = xmlDoc.CreateElement(parentNode);
root.AppendChild(parentXmlNode);
}
#endregion
向一个已经存在的父节点中插入一个子节点#region 向一个已经存在的父节点中插入一个子节点
/**//// <summary>
/// 向一个已经存在的父节点中插入一个子节点
/// </summary>
public void AddChildNode(string parentNodePath, string childNodePath)
{
XmlNode parentXmlNode = xmlDoc.SelectSingleNode(parentNodePath);
XmlNode childXmlNode = xmlDoc.CreateElement(childNodePath);
parentXmlNode.AppendChild(childXmlNode);
}
#endregion
向一个节点添加属性#region 向一个节点添加属性
/**//// <summary>
/// 向一个节点添加属性
/// </summary>
public void AddAttribute(string NodePath, string NodeAttribute)
{
XmlAttribute nodeAttribute = xmlDoc.CreateAttribute(NodeAttribute);
XmlNode nodePath = xmlDoc.SelectSingleNode(NodePath);
nodePath.Attributes.Append(nodeAttribute);
}
#endregion
插入一个节点和它的若干子节点#region 插入一个节点和它的若干子节点
/**//// <summary>
/// 插入一个节点和它的若干子节点
/// </summary>
/// <param name="NewNodeName">插入的节点名称</param>
/// <param name="HasAttributes">此节点是否具有属性,True 为有,False 为无</param>
/// <param name="fatherNode">此插入节点的父节点</param>
/// <param name="htAtt">此节点的属性,Key 为属性名,Value 为属性值</param>
/// <param name="htSubNode"> 子节点的属性, Key 为Name,Value 为InnerText</param>
/// <returns>返回真为更新成功,否则失败</returns>
public bool InsertNode(string NewNodeName, bool HasAttributes, string fatherNode, Hashtable htAtt, Hashtable htSubNode)
{
try
{
xmlDoc.Load(FilePath);
XmlNode root = xmlDoc.SelectSingleNode(fatherNode);
xmlelem = xmlDoc.CreateElement(NewNodeName);
if (htAtt != null && HasAttributes)//若此节点有属性,则先添加属性
{
SetAttributes(xmlelem, htAtt);
AddNodes(xmlelem.Name, xmlDoc, xmlelem, htSubNode);//添加完此节点属性后,再添加它的子节点和它们的InnerText
}
else
{
AddNodes(xmlelem.Name, xmlDoc, xmlelem, htSubNode);//若此节点无属性,那么直接添加它的子节点
}
root.AppendChild(xmlelem);
xmlDoc.Save(FilePath);
return true;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
#endregion
设置节点属性#region 设置节点属性
/**//// <summary>
/// 设置节点属性
/// </summary>
/// <param name="xe">节点所处的Element</param>
/// <param name="htAttribute">节点属性,Key 代表属性名称,Value 代表属性值</param>
public void SetAttributes(XmlElement xe, Hashtable htAttribute)
{
foreach (DictionaryEntry de in htAttribute)
{
xe.SetAttribute(de.Key.ToString(), de.Value.ToString());
}
}
#endregion
增加子节点到根节点下#region 增加子节点到根节点下
/**//// <summary>
/// 增加子节点到根节点下
/// </summary>
/// <param name="rootNode">上级节点名称</param>
/// <param name="xmlDoc">Xml 文档</param>
/// <param name="rootXe">父根节点所属的Element</param>
/// <param name="SubNodes">子节点属性,Key 为Name 值,Value 为InnerText 值</param>
public void AddNodes(string rootNode, XmlDocument xmlDoc, XmlElement rootXe, Hashtable SubNodes)
{
foreach (DictionaryEntry de in SubNodes)
{
xmlnode = xmlDoc.SelectSingleNode(rootNode);
XmlElement subNode = xmlDoc.CreateElement(de.Key.ToString());
subNode.InnerText = de.Value.ToString();
rootXe.AppendChild(subNode);
}
}
#endregion
//更新
设置节点的属性值#region 设置节点的属性值
/**//// <summary>
/// 功能:
/// 设置节点的属性值
/// </summary>
/// <param name="xmlNodePath">节点名称</param>
/// <param name="xmlNodeAttribute">属性名称</param>
/// <param name="xmlNodeAttributeValue">属性值</param>
public void SetXmlNodeValue(string xmlNodePath, string xmlNodeAttribute, string xmlNodeAttributeValue)
{
try
{
//根据指定路径获取节点
XmlNode xmlNode = xmlDoc.SelectSingleNode(xmlNodePath);
//获取节点的属性,并循环取出需要的属性值
XmlAttributeCollection xmlAttr = xmlNode.Attributes;
for (int i = 0; i < xmlAttr.Count; i++)
{
if (xmlAttr.Item(i).Name == xmlNodeAttribute)
{
xmlAttr.Item(i).Value = xmlNodeAttributeValue;
break;
}
}
}
catch (XmlException xmle)
{
throw xmle;
}
}
#endregion
更新节点#region 更新节点
/**//// <summary>
/// 更新节点
/// </summary>
/// <param name="fatherNode">需要更新节点的上级节点</param>
/// <param name="htAtt">需要更新的属性表,Key 代表需要更新的属性,Value 代表更新后的值</param>
/// <param name="htSubNode">需要更新的子节点的属性表,Key 代表需要更新的子节点名字Name,Value 代表更新后的值InnerText</param>
/// <returns>返回真为更新成功,否则失败</returns>
public bool UpdateNode(string fatherNode, Hashtable htAtt, Hashtable htSubNode)
{
try
{
xmlDoc = new XmlDocument();
xmlDoc.Load(FilePath);
XmlNodeList root = xmlDoc.SelectSingleNode(fatherNode).ChildNodes;
UpdateNodes(root, htAtt, htSubNode);
xmlDoc.Save(FilePath);
return true;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
#endregion
更新节点属性和子节点InnerText 值#region 更新节点属性和子节点InnerText 值
/**//// <summary>
/// 更新节点属性和子节点InnerText 值
/// </summary>
/// <param name="root">根节点名字</param>
/// <param name="htAtt">需要更改的属性名称和值</param>
/// <param name="htSubNode">需要更改InnerText 的子节点名字和值</param>
public void UpdateNodes(XmlNodeList root, Hashtable htAtt, Hashtable htSubNode)
{
foreach (XmlNode xn in root)
{
xmlelem = (XmlElement)xn;
if (xmlelem.HasAttributes)//如果节点如属性,则先更改它的属性
{
foreach (DictionaryEntry de in htAtt)//遍历属性哈希表
{
if (xmlelem.HasAttribute(de.Key.ToString()))//如果节点有需要更改的属性
{
xmlelem.SetAttribute(de.Key.ToString(), de.Value.ToString());//则把哈希表中相应的值Value 赋给此属性Key
}
}
}
if (xmlelem.HasChildNodes)//如果有子节点,则修改其子节点的InnerText
{
XmlNodeList xnl = xmlelem.ChildNodes;
foreach (XmlNode xn1 in xnl)
{
XmlElement xe = (XmlElement)xn1;
foreach (DictionaryEntry de in htSubNode)
{
if (xe.Name == de.Key.ToString())//htSubNode 中的key 存储了需要更改的节点名称,
{
xe.InnerText = de.Value.ToString();//htSubNode中的Value存储了Key 节点更新后的数据
}
}
}
}
}
}
#endregion
删除一个节点的属性#region 删除一个节点的属性
/**//// <summary>
/// 删除一个节点的属性
/// </summary>
public void DeleteAttribute(string NodePath, string NodeAttribute, string NodeAttributeValue)
{
XmlNodeList nodePath = xmlDoc.SelectSingleNode(NodePath).ChildNodes;
foreach (XmlNode xn in nodePath)
{
XmlElement xe = (XmlElement)xn;
if (xe.GetAttribute(NodeAttribute) == NodeAttributeValue)
{
xe.RemoveAttribute(NodeAttribute);//删除属性
}
}
}
#endregion
删除一个节点#region 删除一个节点
/**//// <summary>
/// 删除一个节点
/// </summary>
public void DeleteXmlNode(string tempXmlNode)
{
XmlNode xmlNodePath = xmlDoc.SelectSingleNode(tempXmlNode);
xmlNodePath.ParentNode.RemoveChild(xmlNodePath);
}
#endregion
删除指定节点下的子节点#region 删除指定节点下的子节点
/**//// <summary>
/// 删除指定节点下的子节点
/// </summary>
/// <param name="fatherNode">制定节点</param>
/// <returns>返回真为更新成功,否则失败</returns>
public bool DeleteNodes(string fatherNode)
{
try
{
xmlDoc = new XmlDocument();
xmlDoc.Load(FilePath);
xmlnode = xmlDoc.SelectSingleNode(fatherNode);
xmlnode.RemoveAll();
xmlDoc.Save(FilePath);
return true;
}
catch (XmlException xe)
{
throw new XmlException(xe.Message);
}
}
#endregion
私有函数#region 私有函数
private string functionReturn(XmlNodeList xmlList, int i, string nodeName)
{
string node = xmlList[i].ToString();
string rusultNode = "";
for (int j = 0; j < i; j++)
{
if (node == nodeName)
{
rusultNode = node.ToString();
}
else
{
if (xmlList[j].HasChildNodes)
{
functionReturn(xmlList, j, nodeName);
}
else
{
break;
}
}
}
return rusultNode;
}
#endregion
保存XML文件#region 保存XML文件
/**//// <summary>
/// 功能:
/// 保存XML文件
///
/// </summary>
public void SavexmlDocument()
{
try
{
xmlDoc.Save(FilePath);
}
catch (XmlException xmle)
{
throw xmle;
}
}
/**//// <summary>
/// 功能: 保存XML文件
/// </summary>
/// <param name="tempXMLFilePath"></param>
public void SavexmlDocument(string tempXMLFilePath)
{
try
{
xmlDoc.Save(tempXMLFilePath);
}
catch (XmlException xmle)
{
throw xmle;
}
}
#endregion
}
XML 文档解析操作的更多相关文章
- C# 使用XmlDocument类对XML文档进行操作
原创地址:http://www.cnblogs.com/jfzhu/archive/2012/11/19/2778098.html 转载请注明出处 W3C制定了XML DOM标准.很多编程语言中多提供 ...
- jsoup -- xml文档解析
jsoup -- xml文档解析 修改 https://jsoup.org/cookbook/modifying-data/set-attributes https://jsoup.org/cookb ...
- iOS网络编程笔记——XML文档解析
今天利用多余时间研究了一下XML文档解析,虽然现在移动端使用的数据格式基本为JSON格式,但是XML格式毕竟多年来一直在各种计算机语言之间使用,是一种老牌的经典的灵活的数据交换格式.所以我认为还是很有 ...
- xml文档解析
XML文档解主要分为四种解析方式,官方提供的两种分别是:DOM 和 SAX,第三方分别是:JDOM 和 DOM4j 测试用的xml文档: <?xml version="1.0" ...
- Android XML文档解析(一)——SAX解析
---------------------------------------------------------------------------------------------------- ...
- JAVA读取XML,JAVA读取XML文档,JAVA解析XML文档,JAVA与XML,XML文档解析(Document Object Model, DOM)
使用Document Object Model, DOM解析XML文档 也可参考我的新浪博客:http://blog.sina.com.cn/s/blog_43ac5543010190w3.html ...
- MVC模式简单的Xml文档解析加Vue渲染
前端代码: <script src="~/Js/jquery-3.3.1.min.js"></script> <script src="~/ ...
- 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)
众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...
- 【JAVA与DOM4J实现对XML文档的CRUD操作】
一.简介 1.网上下载DOM4J 1.6.1压缩包,解压开之后,发现几个目录和一个jar文件,jar文件是必须的文件其它目录: docs目录:帮助文档的目录,单击index.html: Quick s ...
随机推荐
- Oracle EBS-SQL (SYS-19):sys-用户登陆纪录查询.sql
select * from fnd_user t where t.user_name='user_name'
- 深入Android媒体存储服务(一):APP与媒体存储服务的交互
简介: 本文介绍如何在 Android 中,开发者的 APP 如何使用媒体存储服务(包含MediaScanner.MediaProvider以及媒体信息解析等部分),包括如何把 APP 新增或修改的文 ...
- Tempo 2.0
Tempo 2.0 Tempo is an easy, intuitive JavaScript rendering engine that enables you to craft data tem ...
- Windows Socket I/O模型
老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系.他们的信会被邮递员投递到他们的信箱里.这和Socket模型非常类似.下面我就以老陈接收信件为例讲解Socket I/O模型~~~ 一:s ...
- [Leetcode][Python]30: Substring with Concatenation of All Words
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 30: Substring with Concatenation of All ...
- SDN 编程语言 p4(SDN programming language P4)
行业趋势,SND是未来. P4 是未来. SDN is inevitably, and P4 is inevitably. P4 = Programming Protocol-Independent ...
- 哥德尔,图灵和康托尔 part 2 停机问题
图灵著名的停机问题对于软件开发者而已是非常熟悉的.下面简单描述停机问题: 假设给你一个计算机程序的源代码,也给你所有程序要用的数据,文件,硬盘,DVD等等,所有它需要处理的东西.你能告诉我程序最终是否 ...
- web前端学习之路
test 随着自己对于web前端知识了解的越多,越来越发现自己真的好菜 一脸茫然阶段 两年前大学接触网页设计,那时对于网页设计一窍不通,只是看了一本自己大学编的一本入门教材,我甚至不知道那些网页设计的 ...
- 从文档流来看内联元素和块元素的css排版
veda原创[抄录]讲得很好存自己这里看 从文档流来看内联元素和块元素的css排版 CSS文档流与块级元素(block).内联元素(inline),之前翻阅不少书籍,看过不少文章, 看到所多的是零碎的 ...
- 动态加载 js
要实现动态加载JS脚本有4种方法: 1.直接document.write <script language="javascript"> document.write(& ...