using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Collections; using System.Xml; using System.IO; /// /// XMLParser 简易XML解析方法 ///string str = File.ReadAllText(@"config.xml", Encoding.UTF8); //读取XML文件 /////MessageBox.Show(str); ///XMLParser xmlParser = new XMLParser(); ///XMLNode xn = xmlParser.Parse(str); ///server = xn.GetValue("items>0>server>0>_text"); /// database = xn.GetValue("items>0>database>0>_text"); /// XMLNode temp = xn.GetNode("items>0>res>0"); ///string basePath = temp.GetValue("@basePath");//或直接 basePath=xn.GetValue("items>0>res>0>@basePath"); ///当然xml文件内容为: /// /// /// 192.168.52.148 /// world /// 3306 /// wtx /// 123456 /// /// /// /// /// namespace Job_JieFeng_FTP { public class NoRepeatStrList : List { public void _add(string str) { if (IndexOf(str) < 0) Add(str); } public string getstr() { var result = ""; foreach (string line in this) { if (result != "") result += "\r\n"; result += line; } return result; } } /* public class XMLParser { private char LT = '<'; private char GT = '>'; private char SPACE = ' '; private char QUOTE = '"'; private char QUOTE2 = '\''; private char SLASH = '/'; private char QMARK = '?'; private char EQUALS = '='; private char EXCLAMATION = '!'; private char DASH = '-'; //private char SQL = '['; private char SQR = ']'; public XMLNode Parse(string content) { XMLNode rootNode = new XMLNode(); rootNode["_text"] = ""; string nodeContents = ""; bool inElement = false; bool collectNodeName = false; bool collectAttributeName = false; bool collectAttributeValue = false; bool quoted = false; string attName = ""; string attValue = ""; string nodeName = ""; string textValue = ""; bool inMetaTag = false; bool inComment = false; bool inCDATA = false; XMLNodeList parents = new XMLNodeList(); XMLNode currentNode = rootNode; for (int i = 0; i < content.Length; i++) { char c = content[i]; char cn = '~'; // unused char char cnn = '~'; // unused char char cp = '~'; // unused char if ((i + 1) < content.Length) cn = content[i + 1]; if ((i + 2) < content.Length) cnn = content[i + 2]; if (i > 0) cp = content[i - 1]; if (inMetaTag) { if (c == QMARK && cn == GT) { inMetaTag = false; i++; } continue; } else { if (!quoted && c == LT && cn == QMARK) { inMetaTag = true; continue; } } if (inComment) { if (cp == DASH && c == DASH && cn == GT) { inComment = false; i++; } continue; } else { if (!quoted && c == LT && cn == EXCLAMATION) { if (content.Length > i + 9 && content.Substring(i, 9) == " 0) { if (nodeName[0] == SLASH) { // close tag if (textValue.Length > 0) { currentNode["_text"] += textValue; } textValue = ""; nodeName = ""; currentNode = parents.Pop(); } else { if (textValue.Length > 0) { currentNode["_text"] += textValue; } textValue = ""; XMLNode newNode = new XMLNode(); newNode["_text"] = ""; newNode["_name"] = nodeName; if (currentNode[nodeName] == null) { currentNode[nodeName] = new XMLNodeList(); } XMLNodeList a = (XMLNodeList)currentNode[nodeName]; a.Push(newNode); parents.Push(currentNode); currentNode = newNode; nodeName = ""; } } else { nodeName += c; } } else { if (!quoted && c == SLASH && cn == GT) { inElement = false; collectAttributeName = false; collectAttributeValue = false; if (attName.Length > 0) { if (attValue.Length > 0) { currentNode["@" + attName] = attValue; } else { currentNode["@" + attName] = true; } } i++; currentNode = parents.Pop(); attName = ""; attValue = ""; } else if (!quoted && c == GT) { inElement = false; collectAttributeName = false; collectAttributeValue = false; if (attName.Length > 0) { currentNode["@" + attName] = attValue; } attName = ""; attValue = ""; } else { if (collectAttributeName) { if (c == SPACE || c == EQUALS) { collectAttributeName = false; collectAttributeValue = true; } else { attName += c; } } else if (collectAttributeValue) { if (c == QUOTE || c == QUOTE2) { if (quoted) { collectAttributeValue = false; currentNode["@" + attName] = attValue; attValue = ""; attName = ""; quoted = false; } else { quoted = true; } } else { if (quoted) { attValue += c; } else { if (c == SPACE) { collectAttributeValue = false; currentNode["@" + attName] = attValue; attValue = ""; attName = ""; } } } } else if (c == SPACE) { } else { collectAttributeName = true; attName = "" + c; attValue = ""; quoted = false; } } } } else { if (c == LT) { inElement = true; collectNodeName = true; } else { textValue += c; } } } return rootNode; } /// /// 传入一个node列表 和一个 路径 一个值 /// 返回节点列表里面,【该路径=该值】的节点 /// /// /// /// /// /// public static bool getNode(XMLNodeList nodelist, string path, string value,out XMLNode xn) { xn = new XMLNode(); foreach (XMLNode nd in nodelist) { if (nd.GetValue(path) == value) { xn = nd; return true; } } return false; } } public class XMLNode : Hashtable { public XMLNodeList GetNodeList(string path) { return GetObject(path) as XMLNodeList; } public XMLNode GetNode(string path) { return GetObject(path) as XMLNode; } public string GetValue(string path) { return GetObject(path) as string; } private object GetObject(string path) { string[] bits = path.Split('>'); XMLNode currentNode = this; XMLNodeList currentNodeList = null; bool listMode = false; object ob; for (int i = 0; i < bits.Length; i++) { if (listMode) { currentNode = (XMLNode)currentNodeList[int.Parse(bits[i])]; ob = currentNode; listMode = false; } else { ob = currentNode[bits[i]]; if (ob is ArrayList) { currentNodeList = (XMLNodeList)(ob as ArrayList); listMode = true; } else { // reached a leaf node/attribute if (i != (bits.Length - 1)) { // unexpected leaf node string actualPath = ""; for (int j = 0; j <= i; j++) { actualPath = actualPath + ">" + bits[j]; } //Debug.Log("xml path search truncated. Wanted: " + path + " got: " + actualPath); } return ob; } } } if (listMode) return currentNodeList; else return currentNode; } } public class XMLNodeList : ArrayList { public XMLNode Pop() { XMLNode item = null; item = (XMLNode)this[this.Count - 1]; this.Remove(item); return item; } public int Push(XMLNode item) { Add(item); return this.Count; } } */ /// /// Author: jiangxiaoqiang /// public class XmlReader { //========================================================= // #region 获取XmlDocument对象 /// /// 根据XML文件内容获取XmlDocument对象 /// /// /// public static XmlDocument GetXmlDocByXmlContent(string xmlFileContent) { if (string.IsNullOrEmpty(xmlFileContent)) { return null; } var xDoc = new XmlDocument(); try { xDoc.LoadXml(xmlFileContent); } catch { xDoc = null; } return xDoc; } /// /// 根据XML文件路径获取XmlDocument对象 /// /// /// public static XmlDocument GetXmlDocByFilePath(string xmlFilePath) { if (string.IsNullOrEmpty(xmlFilePath) || !File.Exists(xmlFilePath)) { return null; } var xDoc = new XmlDocument(); try { xDoc.Load(xmlFilePath); } catch { throw new Exception(string.Format("请确认该XML文件格式正确,路径为:{0}", xmlFilePath)); } return xDoc; } #endregion //========================================================= // //========================================================= // #region 获取XML节点(或节点列表) /// /// 获取父节点下指定节点名称的第一个子节点 /// /// /// /// public static XmlNode GetFirstChildNodeByName(XmlNode parentXmlNode, string childNodeName, XmlNamespaceManager npm = null) { var childXmlNodes = GetChildNodesByName(parentXmlNode, childNodeName,npm); if (childXmlNodes != null && childXmlNodes.Count > 0) { return childXmlNodes[0]; } return null; } /// /// 获取父节点下指定节点名称的子节点列表 /// /// 父节点 /// 节点名称 /// public static XmlNodeList GetChildNodesByName(XmlNode parentXmlNode, string nodeName, XmlNamespaceManager npm = null) { if (parentXmlNode == null || string.IsNullOrEmpty(nodeName)) { return null; } return GetChildNodesByXPathExpr(parentXmlNode, string.Format(".//{0}", nodeName), npm); //return GetChildNodesByXPathExpr(parentXmlNode, string.Format("//{0}", nodeName), npm); } /// /// 获取父节点下满足xpathExpr表达式的XML子节点列表 /// /// 父节点 /// /// public static XmlNodeList GetChildNodesByXPathExpr(XmlNode parentXmlNode, string xpathExpr, XmlNamespaceManager npm=null) { if (parentXmlNode == null || string.IsNullOrEmpty(xpathExpr)) { return null; } return parentXmlNode.SelectNodes(xpathExpr,npm); } /// /// 获取父节点下的第一个子节点 /// /// /// public static XmlNode GetFirstChildNode(XmlNode parentXmlNode) { var childXmlNodes = GetChildNodes(parentXmlNode); if (childXmlNodes != null && childXmlNodes.Count > 0) { return childXmlNodes[0]; } return null; } /// /// 获取父节点的子节点列表 /// /// 父节点 /// public static XmlNodeList GetChildNodes(XmlNode parentXmlNode) { return parentXmlNode == null ? null : parentXmlNode.ChildNodes; } #endregion //========================================================= // //========================================================= // #region 读取节点属性值 /// /// 读取某个XML节点的属性值(根据属性名) /// /// /// /// public static string ReadAttrValue(XmlNode xmlNode, string attrName) { var xmlElement = xmlNode as XmlElement; return xmlElement == null ? null : xmlElement.GetAttribute(attrName); } /// /// 读取父节点下指定节点名和属性名的第一个子节点的属性值 /// /// XML父节点 /// 节点名称 /// 属性名 /// public static string ReadFirstAttrValue(XmlNode parentXmlNode, string childNodeName, string attrName) { var attrVals = ReadAttrValues(parentXmlNode, childNodeName, attrName); return (attrVals == null || attrVals.Length == 0) ? null : attrVals[0]; } /// /// 读取父节点下指定节点名和属性名的所有子节点的该属性值的数组 /// /// XML文档 /// 节点名称 /// 属性名 /// public static string[] ReadAttrValues(XmlNode parentXmlNode, string childNodeName, string attrName, XmlNamespaceManager npm = null) { if (parentXmlNode == null || string.IsNullOrEmpty(childNodeName) || string.IsNullOrEmpty(attrName)) { return null; } var xpathExpr = string.Format("//{0}[@{1}]", childNodeName, attrName); var nodes = GetChildNodesByXPathExpr(parentXmlNode, xpathExpr, npm); if (nodes != null && nodes.Count > 0) { var nodeCount = nodes.Count; var attrVals = new string[nodeCount]; for (var i = 0; i < nodeCount; i++) { attrVals[i] = ((XmlElement)nodes[i]).GetAttribute(attrName); } return attrVals; } return null; } #endregion #region 扩展方法 /// /// 返回一个节点,这个节点是【作为参数的父节点】下面的所有【名称为NodeName】的子节点当中,第一个具有【指定属性名AttrName=指定属性值AttrValue】的 /// /// /// /// /// public static XmlNode getNodeByAttr(XmlNode parentXmlNode,string NodeName, string AttrName, string AttrValue, XmlNamespaceManager npm = null) { XmlNodeList nodelist = GetChildNodesByName(parentXmlNode, NodeName, npm); foreach (XmlNode _item in nodelist) { var _attrvalue = ReadAttrValue(_item, AttrName); if (_attrvalue == AttrValue) { return _item; } } return null; } // public static string getmlstr(XmlNode node) { var stringarray = XmlReader.ReadChildNodeTexts(node); var result = ""; foreach (string line in stringarray) { if (result != "") result += "\r\n"; result += line; } return result; } public static string getmlstr(XmlNodeList nodeList) { var strlist = new NoRepeatStrList(); foreach (XmlNode node in nodeList) { var _r = getmlstr(node); strlist._add(_r); } return strlisttostr(strlist); } public static string strlisttostr(List strlist) { var result = ""; foreach (string line in strlist) { if (result != "") result += "\r\n"; result += line; } return result; } #endregion //========================================================= // //========================================================= // #region 读取父节点下的子节点的文本内容 /// /// 读取父节点下指定节点名的第一个子节点的文本 /// /// /// /// public static string ReadFirstChildNodeTextByName(XmlNode parentXmlNode, string childNodeName, XmlNamespaceManager npm = null) { var childNodeTexts = ReadChildNodeTextsByName(parentXmlNode, childNodeName,npm); if (childNodeTexts != null && childNodeTexts.Length > 0) { return childNodeTexts[0]; } return null; } /// /// 读取第N个指定节点名的子节点的文本 /// /// /// /// public static string ReadNChildNodeTextByName(XmlNode parentXmlNode, string childNodeName,int N) { var childNodeTexts = ReadChildNodeTextsByName(parentXmlNode, childNodeName); if (childNodeTexts != null && childNodeTexts.Length > N-1) { return childNodeTexts[N]; } return null; } /// /// 读取父节点下指定节点名的所有子节点的文本数组 /// /// /// /// public static string[] ReadChildNodeTextsByName(XmlNode parentXmlNode, string childNodeName, XmlNamespaceManager npm = null) { if (parentXmlNode == null || string.IsNullOrEmpty(childNodeName)) { return null; } var xpathExpr = string.Format(".//{0}", childNodeName); var childNodes = GetChildNodesByXPathExpr(parentXmlNode, xpathExpr, npm); if (childNodes != null && childNodes.Count > 0) { var nodeCount = childNodes.Count; var nodeTexts = new string[nodeCount]; for (var i = 0; i < nodeCount; i++) { nodeTexts[i] = childNodes[i].InnerText; } return nodeTexts; } return null; } /// /// 读取父节点下的第一个子节点的文本 /// /// /// public static string ReadFirstChildNodeText(XmlNode parentXmlNode) { var childNodeTexts = ReadChildNodeTexts(parentXmlNode); if (childNodeTexts != null && childNodeTexts.Length > 0) { return childNodeTexts[0]; } return null; } /// /// 读取父节点下的所有子节点的文本数组 /// /// /// public static string[] ReadChildNodeTexts(XmlNode parentXmlNode) { if (parentXmlNode == null) { return null; } var childNodes = GetChildNodes(parentXmlNode); if (childNodes != null && childNodes.Count > 0) { var nodeCount = childNodes.Count; var nodeTexts = new string[nodeCount]; for (var i = 0; i < nodeCount; i++) { nodeTexts[i] = childNodes[i].InnerText; } return nodeTexts; } return null; } public static string ReadChildNodeTextsStr(XmlNode parentXmlNode) { if (parentXmlNode == null) { return null; } var result = ""; var childNodes = GetChildNodes(parentXmlNode); if (childNodes != null && childNodes.Count > 0) { var nodeCount = childNodes.Count; var nodeTexts = new string[nodeCount]; for (var i = 0; i < nodeCount; i++) { nodeTexts[i] = childNodes[i].InnerText; } foreach (string s in nodeTexts) { if (result != "") result += "\r\n"; result += s; } return result; } return null; } /// /// 读取XML节点文本 /// /// /// public static string ReadNodeText(XmlNode xmlNode) { if (xmlNode == null) { return null; } return xmlNode.InnerText; } #endregion //========================================================= // } }