得到 XML 元素

来源:互联网 发布:京东数据罗盘 编辑:程序博客网 时间:2024/04/30 23:03

命名空间:System.Xml;
使用的类:XmlDocument
实现目的:得到每节元素,但并不包含CDATAText

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());


这里是加载一个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);

 

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))
        
{
            
+ 子节点
        }

        
else
        
{
            
+ 父节点
        }

    }

}

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;
}