命名空间:System.Xml;
使用的类:XmlDocument
实现目的:得到每节元素,但并不包含CDATA和Text
1.实例化一个XmlDocument对象用于操作Xml
XmlDocument xmldoc
=
new
XmlDocument();
2.加载XML文档,这里可以是文件流,字符串或XML路径
StringBuilder xmlContent
=
new
StringBuilder();
xmlContent.Append( " <?xml version="1.0" encoding="GBK"?> " );
xmlContent.Append( " <root systemname="内容"> " );
xmlContent.Append( " </root> " );
xmldoc.LoadXml(xmlContent.ToString());
xmlContent.Append( " <?xml version="1.0" encoding="GBK"?> " );
xmlContent.Append( " <root systemname="内容"> " );
xmlContent.Append( " </root> " );
xmldoc.LoadXml(xmlContent.ToString());
这里是加载一个XML字符串,如果想加载文件流或者是XML路径可使用下面的语句
byte
[] buf
=
new
byte
[xmlContent.ToString().Length];
buf = Convert.FromBase64String(xmlContent.ToString());
buf = System.Text.ASCIIEncoding.UTF8.GetBytes(xmlContent.ToString());
xmldoc.Load( new MemoryStream(buf));
string url = @" C: ext.xml " ;
xmldoc.Load(url);
buf = Convert.FromBase64String(xmlContent.ToString());
buf = System.Text.ASCIIEncoding.UTF8.GetBytes(xmlContent.ToString());
xmldoc.Load( new MemoryStream(buf));
string url = @" C: ext.xml " ;
xmldoc.Load(url);
3.获得根节点,但并不包含<?xml version="1.0" encoding="GBK"?>
XmlElement element
=
xmldoc.DocumentElement;
4.递归得到每个节点的信息
protected
void
cycNode(XmlNode node)
... {
// 判断节点的类型,过滤掉不想要的节点
// 在此循环中,会将Text和CDATA都视为节点
// 因此,有必要做一次判断
if (node.NodeType == XmlNodeType.Element)
...{
// 在这里判断此节点是子节点
if (!hasChildNodes(node))
...{
+ 子节点#region + 子节点
// 获得节点的名称
string name = node.Name;
// 获得属性
string attributes = node.Attributes["systemname"].Value;
#endregion
}
else
...{
+ 父节点#region + 父节点
// 获得父节点的名称
string name = node.Name;
// 获得父节点属性
string attributes = node.Attributes["systemname"].Value;
// 得到节点的下级子节点
XmlNodeList nodes = node.ChildNodes;
// 下级子节点的总数
int length = node.ChildNodes.Count;
for (int i = 0; i < length; i++)
...{
// 递归
cycNode(nodes[i]);
}
#endregion
}
}
}
protected bool hasChildNodes(XmlNode node)
... {
if (node.HasChildNodes)
...{
// 如果节点里只有Text或CDATA,那么,就不算是根节点
if (node.ChildNodes.Count == 1 && (node.ChildNodes.Item(0).NodeType == XmlNodeType.CDATA || node.ChildNodes.Item(0).NodeType == XmlNodeType.Text))
return false;
else
return true;
}
else
...{
return false;
}
}
... {
// 判断节点的类型,过滤掉不想要的节点
// 在此循环中,会将Text和CDATA都视为节点
// 因此,有必要做一次判断
if (node.NodeType == XmlNodeType.Element)
...{
// 在这里判断此节点是子节点
if (!hasChildNodes(node))
...{
+ 子节点#region + 子节点
// 获得节点的名称
string name = node.Name;
// 获得属性
string attributes = node.Attributes["systemname"].Value;
#endregion
}
else
...{
+ 父节点#region + 父节点
// 获得父节点的名称
string name = node.Name;
// 获得父节点属性
string attributes = node.Attributes["systemname"].Value;
// 得到节点的下级子节点
XmlNodeList nodes = node.ChildNodes;
// 下级子节点的总数
int length = node.ChildNodes.Count;
for (int i = 0; i < length; i++)
...{
// 递归
cycNode(nodes[i]);
}
#endregion
}
}
}
protected bool hasChildNodes(XmlNode node)
... {
if (node.HasChildNodes)
...{
// 如果节点里只有Text或CDATA,那么,就不算是根节点
if (node.ChildNodes.Count == 1 && (node.ChildNodes.Item(0).NodeType == XmlNodeType.CDATA || node.ChildNodes.Item(0).NodeType == XmlNodeType.Text))
return false;
else
return true;
}
else
...{
return false;
}
}
按照上面的方法,应该就可以将数据罗列出来了
不仅可以递归节点,还可以在不知道有多少个属性的情况下,循环得到节点的属性
protected
string
cycAttributes(XmlNode node)
... {
string returnValue = string.Empty;
// 得到节点的所有属性
XmlAttributeCollection attributes = node.Attributes;
if (attributes == null) returnValue = "";
// 节点中属性的总数
int length = attributes.Count;
if (length > 0)
...{
StringBuilder sbAttributes = new StringBuilder();
for (int i = 0; i < length; i++)
...{
sbAttributes.Append("属性名:");
sbAttributes.Append(attributes.Item(i).Name);
sbAttributes.Append("属性值:");
sbAttributes.Append(attributes.Item(i).Value);
}
returnValue = sbAttributes.ToString();
}
// 返回结果
return returnValue;
}
... {
string returnValue = string.Empty;
// 得到节点的所有属性
XmlAttributeCollection attributes = node.Attributes;
if (attributes == null) returnValue = "";
// 节点中属性的总数
int length = attributes.Count;
if (length > 0)
...{
StringBuilder sbAttributes = new StringBuilder();
for (int i = 0; i < length; i++)
...{
sbAttributes.Append("属性名:");
sbAttributes.Append(attributes.Item(i).Name);
sbAttributes.Append("属性值:");
sbAttributes.Append(attributes.Item(i).Value);
}
returnValue = sbAttributes.ToString();
}
// 返回结果
return returnValue;
}