求C# 获取xml某个节点值方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求C# 获取xml某个节点值方法相关的知识,希望对你有一定的参考价值。

XML文档如下:
<?xml version="1.0" encoding="UTF-16"?>

<packets>

<proto name="1" showname="2">

<field name="1111" showname="2222" show="3333"/>

<field name="111" showname="222" show="333"/>

</proto>

<proto name="11" showname="222">

<field name="11111" showname="22222" show="33333"/>

<field name="111111" showname="22222" show="333333"/>

</proto>

</packets>
-------
要判断每个节点的值是不是所需要的....
不是我想要的....

参考技术A /// <summary>
/// XmlDocument扩展类
///
/// 目的:用于优化和减少代码书写量
/// 备注:Element 译为:元素
/// Document 译为:文档
/// Node 译为:节点
/// </summary>
public class XmlDocumentExtender : XmlDocument


public XmlDocumentExtender()
: base()



#region 扩展的构造函数

#if NET1
public XmlDocumentExtender(XmlNameTable nt)
: base(new XmlImplementation())


#else
public XmlDocumentExtender(XmlNameTable nt)
: base(new XmlImplementation(nt))


#endif

#endregion

/// <summary>
/// 加载的文件名(含路径)
/// </summary>
/// <param name="filename"></param>
public override void Load(string filename)

if (Maunite.Common.FileUtils.FileExists(filename))

base.Load(filename);

else

throw new Exception("文件: " + filename + " 不存在!");



/// <summary>
/// 在指定的Xml元素下,添加子Xml元素
/// </summary>
/// <param name="xmlElement">被追加子元素的Xml元素</param>
/// <param name="childElementName">要添加的Xml元素名称</param>
/// <param name="childElementValue">要添加的Xml元素值</param>
/// <returns></returns>
public bool AppendChildElementByNameValue(ref XmlElement xmlElement, string childElementName, object childElementValue)

return AppendChildElementByNameValue(ref xmlElement, childElementName, childElementValue, false);


/// <summary>
/// 在指定的Xml元素下,添加子Xml元素
/// </summary>
/// <param name="xmlElement">被追加子元素的Xml元素</param>
/// <param name="childElementName">要添加的Xml元素名称</param>
/// <param name="childElementValue">要添加的Xml元素值</param>
/// <param name="IsCDataSection">是否是CDataSection类型的子元素</param>
/// <returns></returns>
public bool AppendChildElementByNameValue(ref XmlElement xmlElement, string childElementName, object childElementValue, bool IsCDataSection)

if ((xmlElement != null) && (xmlElement.OwnerDocument != null))

//是否是CData类型Xml元素
if (IsCDataSection)

XmlCDataSection tempdata = xmlElement.OwnerDocument.CreateCDataSection(childElementName);
tempdata.InnerText = FiltrateControlCharacter(childElementValue.ToString());
XmlElement childXmlElement = xmlElement.OwnerDocument.CreateElement(childElementName);
childXmlElement.AppendChild(tempdata);
xmlElement.AppendChild(childXmlElement);

else

XmlElement childXmlElement = xmlElement.OwnerDocument.CreateElement(childElementName);
childXmlElement.InnerText = FiltrateControlCharacter(childElementValue.ToString());
xmlElement.AppendChild(childXmlElement);

return true;

else

return false;



/// <summary>
/// 在指定的Xml结点下,添加子Xml元素
/// </summary>
/// <param name="xmlElement">被追加子元素的Xml节点</param>
/// <param name="childElementName">要添加的Xml元素名称</param>
/// <param name="childElementValue">要添加的Xml元素值</param>
/// <returns></returns>
public bool AppendChildElementByNameValue(ref XmlNode xmlNode, string childElementName, object childElementValue)

return AppendChildElementByNameValue(ref xmlNode, childElementName, childElementValue, false);


/// <summary>
/// 在指定的Xml结点下,添加子Xml元素
/// </summary>
/// <param name="xmlElement">被追加子元素的Xml节点</param>
/// <param name="childElementName">要添加的Xml元素名称</param>
/// <param name="childElementValue">要添加的Xml元素值</param>
/// <param name="IsCDataSection">是否是CDataSection类型的子元素</param>
/// <returns></returns>
public bool AppendChildElementByNameValue(ref XmlNode xmlNode, string childElementName, object childElementValue, bool IsCDataSection)

if ((xmlNode != null) && (xmlNode.OwnerDocument != null))

//是否是CData类型Xml结点
if (IsCDataSection)

XmlCDataSection tempdata = xmlNode.OwnerDocument.CreateCDataSection(childElementName);
tempdata.InnerText = FiltrateControlCharacter(childElementValue.ToString());
XmlElement childXmlElement = xmlNode.OwnerDocument.CreateElement(childElementName);
childXmlElement.AppendChild(tempdata);
xmlNode.AppendChild(childXmlElement);

else

XmlElement childXmlElement = xmlNode.OwnerDocument.CreateElement(childElementName);
childXmlElement.InnerText = FiltrateControlCharacter(childElementValue.ToString());
xmlNode.AppendChild(childXmlElement);

return true;

else

return false;



/// <summary>
/// 通过数据行向当前XML元素下追加子元素
/// </summary>
/// <param name="xmlElement">被追加子元素的Xml元素</param>
/// <param name="dcc">当前数据表中的列集合</param>
/// <param name="dr">当前行数据</param>
/// <returns></returns>
public bool AppendChildElementByDataRow(ref XmlElement xmlElement, DataColumnCollection dcc, DataRow dr)

return AppendChildElementByDataRow(ref xmlElement, dcc, dr, null);


/// <summary>
/// 通过数据行向当前XML元素下追加子元素
/// </summary>
/// <param name="xmlElement">被追加子元素的Xml元素</param>
/// <param name="dcc">当前数据表中的列集合</param>
/// <param name="dr">当前行数据</param>
/// <param name="removecols">不会被追加的列名</param>
/// <returns></returns>
public bool AppendChildElementByDataRow(ref XmlElement xmlElement, DataColumnCollection dcc, DataRow dr, string removecols)

if((xmlElement != null)&&(xmlElement.OwnerDocument != null))

foreach (DataColumn dc in dcc)

if ((removecols == null) ||
(removecols == "") ||
(("," + removecols + ",").ToLower().IndexOf("," + dc.Caption.ToLower() + ",") < 0))

XmlElement tempElement = xmlElement.OwnerDocument.CreateElement(dc.Caption);
tempElement.InnerText = FiltrateControlCharacter(dr[dc.Caption].ToString().Trim());
xmlElement.AppendChild(tempElement);


return true;

else

return false;



/// <summary>
/// 实始化节点, 当节点存在则清除当前路径下的所有子结点, 如不存在则直接创建该结点
/// </summary>
/// <param name="xmlpath"></param>
/// <returns></returns>
public XmlNode InitializeNode(string xmlpath)

XmlNode xmlNode = this.SelectSingleNode(xmlpath);
if (xmlNode != null)

xmlNode.RemoveAll();

else

xmlNode = CreateNode(xmlpath);

return xmlNode;


/// <summary>
/// 删除指定路径下面的所有子结点和自身
/// </summary>
/// <param name="xmlpath">指定路径</param>
public void RemoveNodeAndChildNode(string xmlpath)

XmlNodeList xmlNodeList = this.SelectNodes(xmlpath);
if (xmlNodeList.Count > 0)

foreach (XmlNode xn in xmlNodeList)

xn.RemoveAll();
xn.ParentNode.RemoveChild(xn);




/// <summary>
/// 创建指定路径下的节点
/// </summary>
/// <param name="xmlpath">节点路径</param>
/// <returns></returns>
public XmlNode CreateNode(string xmlpath)


string[] xpathArray = xmlpath.Split('/');
string root = "";
XmlNode parentNode = this;
//建立相关节点
for (int i = 1; i < xpathArray.Length; i++)

XmlNode node = this.SelectSingleNode(root + "/" + xpathArray[i]);
// 如果当前路径不存在则建立,否则设置当前路径到它的子路径上
if (node == null)

XmlElement newElement = this.CreateElement(xpathArray[i]);
parentNode.AppendChild(newElement);

//设置低一级的路径
root = root + "/" + xpathArray[i];
parentNode = this.SelectSingleNode(root);


return parentNode;


/// <summary>
/// 得到指定路径的节点值
/// </summary>
/// <param name="xmlnode">要查找节点</param>
/// <param name="path">指定路径</param>
/// <returns></returns>
public string GetSingleNodeValue(XmlNode xmlnode, string path)

if (xmlnode == null)

return null;


if (xmlnode.SelectSingleNode(path) != null)

if (xmlnode.SelectSingleNode(path).LastChild != null)

return xmlnode.SelectSingleNode(path).LastChild.Value;

else

return "";


return null;


/// <summary>
/// 过滤控制字符,包括0x00 - 0x08,0x0b - 0x0c,0x0e - 0x1f
/// </summary>
/// <param name="content">要过滤的内容</param>
/// <returns>过滤后的内容</returns>
private string FiltrateControlCharacter(string content)

return Regex.Replace(content, "[\x00-\x08|\x0b-\x0c|\x0e-\x1f]", "");

本回答被提问者采纳
参考技术B j

以上是关于求C# 获取xml某个节点值方法的主要内容,如果未能解决你的问题,请参考以下文章

C#如何读取XML中指定的节点值?

C# 获取 XML 节点值

如何在c#中使用xelement获取xml节点值

获取 xml 节点值尝试使用 SelectSingleNode 和 SelectNodes 使用 c#

如何获取xml某个节点的多个值

在 C# 中使用 XElement 获取 XML 的元素节点值