在编写各种通讯接口时,往往会遇到通讯报文的解析,这里分享一些关于xml处理的工具类代码!
public static XmlDocument CreateXML(string rootName)
{
XmlDocument xdoc = new XmlDocument();
XmlDeclaration dec = xdoc.CreateXmlDeclaration("1.0", "utf-8", null);
xdoc.AppendChild(dec);
//创建一个根节点(一级)
XmlElement root = xdoc.CreateElement(rootName);
xdoc.AppendChild(root);
return xdoc;
}
/// <summary>
/// 读取数据
/// </summary>
/// <param name="path">路径</param>
/// <param name="node">节点</param>
/// <param name="attribute">属性名,非空时返回该属性值,否则返回串联值</param>
/// <returns>string</returns>
/**************************************************
* 使用示列:
* Read("/Node", "")
* Read("/Node/Element[@Attribute='Name']", "Attribute")
************************************************/
private string Read(string node, string attribute)
{
string value = "";
try
{
xn = doc.SelectSingleNode(node);
value = (attribute.Equals("") ? xn.InnerText : xn.Attributes[attribute].Value);
}
catch { }
return value;
}
/// <summary>
/// 读取指定节点的串联值
/// </summary>
/// <param name="node">节点</param>
/// <returns></returns>
public string ReadByNode(string node)
{
return Read(node, "");
}
/// <summary>
/// 读取指定属性的节点的串联值
/// </summary>
/// <param name="node">节点</param>
/// <param name="attribute">属性名称</param>
/// <param name="value">属性值</param>
/// <returns></returns>
public string ReadByAttribute(string node,string attribute,string value)
{
return Read(node + "[@" + attribute + "='" + value + "']", "");
}
/// <summary>
/// 读取属性值
/// </summary>
/// <param name="node">节点</param>
/// <param name="attribute">属性名称</param>
/// <returns></returns>
public string ReadAttributeValue(string node, string attribute)
{
return Read(node, attribute);
}
/// <summary>
/// 插入数据
/// </summary>
/// <param name="node">节点</param>
/// <param name="element">元素名,非空时插入新元素,否则在该元素中插入属性</param>
/// <param name="attribute">属性名,非空时插入该元素属性值,否则插入元素值</param>
/// <param name="value">值</param>
/// <returns></returns>
/**************************************************
* 使用示列:
* Insert("/Node", "Element", "", "Value")
* Insert("/Node", "Element", "Attribute", "Value")
* Insert("/Node", "", "Attribute", "Value")
************************************************/
private void Insert(string node, string element, string attribute, string value)
{
try
{
xn = doc.SelectSingleNode(node);
if (element.Equals(""))
{
if (!attribute.Equals(""))
{
XmlElement xe = (XmlElement)xn;
xe.SetAttribute(attribute, value);
}
}
else
{
XmlElement xe = doc.CreateElement(element);
if (attribute.Equals(""))
xe.InnerText = value;
else
xe.SetAttribute(attribute, value);
xn.AppendChild(xe);
}
//doc.Save(path);
}
catch { }
}
/// <summary>
/// 在节点中插入空元素
/// </summary>
/// <param name="node">节点</param>
/// <param name="element">元素名</param>
/**************************************
*
* InsertElement("/Root", "Studio");
*
*************************************/
public void InsertElement(string node, string element)
{
Insert(node, element, "", "");
}
/// <summary>
/// 在节点中插入带属性的元素
/// </summary>
/// <param name="node">节点</param>
/// <param name="element">元素名</param>
/// <param name="attribute">属性名</param>
/// <param name="value">属性值</param>
/**************************************
*
* InsertAttribute("/Root/Studio", "Site", "Name", "XX工作室");
*
*************************************/
public void InsertElementAndAttribute(string node, string element, string attribute, string value)
{
Insert(node, element, attribute, value);
}
/// <summary>
/// 在节点中插入带正文的元素
/// </summary>
/// <param name="node">节点</param>
/// <param name="element">元素名</param>
/// <param name="value">正文</param>
/**************************************
*
* InsertContent("/Root/Studio/Site[@Name='XX工作室']", "Master", "张总");
* InsertContent("/Root/Studio", "Master", "张总");
*
*************************************/
public void InsertContent(string node, string element, string value)
{
Insert(node, element, "", value);
}
/// <summary>
/// 在节点中插入属性
/// </summary>
/// <param name="node">节点</param>
/// <param name="attribute">属性名</param>
/// <param name="value">属性值</param>
/**************************************
*
* InsertAttribute("/Root/Studio/Site[@Name='XX工作室']", "Url", "http://www.XXX.com/");
* InsertAttribute("/Root/Studio, "Url", "http://www.XXX.com/");
*
*************************************/
public void InsertAttribute(string node, string attribute, string value)
{
Insert(node, "", attribute, value);
}
/// <summary>
/// 在节点中插入带属性带正文的元素
/// </summary>
/// <param name="node">节点</param>
/// <param name="element">元素名</param>
/// <param name="attribute">属性名</param>
/// <param name="avalue">属性值</param>
/// <param name="content">正文</param>
public void InsertElementAndAttributeAndContent(string node, string element, string attribute, string avalue, string content)
{
try
{
xn = doc.SelectSingleNode(node);
XmlElement xe = doc.CreateElement(element);
xe.InnerText = content;
xe.SetAttribute(attribute, avalue);
xn.AppendChild(xe);
//doc.Save(path);
}
catch { }
}
/// <summary>
/// 修改数据
/// </summary>
/// <param name="node">节点</param>
/// <param name="attribute">属性名,非空时修改该节点属性值,否则修改节点值</param>
/// <param name="value">值</param>
/// <returns></returns>
/**************************************************
* 使用示列:
* Insert("/Node", "", "Value")
* Insert("/Node", "Attribute", "Value")
************************************************/
private void Update(string node, string attribute, string value)
{
try
{
xn = doc.SelectSingleNode(node);
if (xn == null)
{
string[] ele = node.Split('/');
InsertElement(ele[1], ele[ele.Length - 1]);
xn = doc.SelectSingleNode(node);
}
XmlElement xe = (XmlElement)xn;
if (attribute.Equals(""))
xe.InnerText = value;
else
xe.SetAttribute(attribute, value);
//doc.Save(path);
}
catch { }
}
/// <summary>
/// 删除数据
/// </summary>
/// <param name="node">节点</param>
/// <param name="attribute">属性名,非空时删除该节点属性值,否则删除节点值</param>
/// <param name="value">值</param>
/// <returns></returns>
/**************************************************
* 使用示列:
* Delete("/Node", "")
* Delete("/Node", "Attribute")
************************************************/
private void Delete(string node, string attribute)
{
try
{
xn = doc.SelectSingleNode(node);
XmlElement xe = (XmlElement)xn;
if (attribute.Equals(""))
xn.ParentNode.RemoveChild(xn);
else
xe.RemoveAttribute(attribute);
//doc.Save(path);
}
catch { }
}
/// <summary>
/// datatable转化为xml,生成对应的循环节点
/// </summary>
/// <param name="dt">数据表</param>
/// <param name="nodelist">循环节点</param>
/// <param name="nodename">循环子节点名</param>
/// <returns></returns>
public XmlDocument DataTableToXml(DataTable dt,string nodelist,string nodename)
{
System.Text.StringBuilder strXml = new System.Text.StringBuilder();
strXml.AppendLine("<" + nodelist + ">");
for (int i = 0; i < dt.Rows.Count; i++)
{
strXml.AppendLine("<" + nodename + ">");
for (int j = 0; j < dt.Columns.Count; j++)
{
strXml.AppendLine("<" + dt.Columns[j].ColumnName + ">" + dt.Rows[i][j].ToString().Replace("&", "&").Replace("<", "<") + "</" + dt.Columns[j].ColumnName + ">");
}
strXml.AppendLine("</" + nodename + ">");
}
strXml.AppendLine("</" + nodelist + ">");
//DeleteElement("//ebank//list");
XmlDocument doc2 = new XmlDocument();
doc2.LoadXml(strXml.ToString());
XmlNode root1 = doc.SelectSingleNode("//ebank//" + nodelist);
if (root1 == null)
{
XmlHelper xhe = new XmlHelper(doc);
xhe.UpdateContent("/ebank/"+nodelist, "");
doc = xhe.GetXmlDoc();
root1 = doc.SelectSingleNode("//ebank//"+nodelist);
}
foreach (XmlNode n in doc2.DocumentElement.ChildNodes)
{
XmlNode root2 = doc.ImportNode(n, true);
root1.AppendChild(root2);
}
return doc;
}