一个xmltojson类

ContractedBlock.gif ExpandedBlockStart.gif Code
using System.Text;
using System.Xml;
using System.Collections;
public class xmltojson
{
    
public xmltojson()
    {  
//  // TODO: 在此处添加构造函数逻辑  //
    }//这里我将它变成了public的属性。  
    public static string XmlToJSON(XmlDocument xmlDoc)
    {
        StringBuilder sbJSON 
= new StringBuilder();
        sbJSON.Append(
"");
        XmlToJSONnode(sbJSON, xmlDoc.DocumentElement, 
true);
        sbJSON.Append(
"}"); return sbJSON.ToString();
    }
    
//  XmlToJSONnode:  Output an XmlElement, possibly as part of a higher array 
    private static void XmlToJSONnode(StringBuilder sbJSON, XmlElement node, bool showNodeName)
    {
        
if (showNodeName)
            sbJSON.Append(
"\"" + SafeJSON(node.Name) + "\"");
        sbJSON.Append(
"{");
        
// Build a sorted list of key-value pairs     
        
//  where   key is case-sensitive nodeName    
        
//          value is an ArrayList of string or XmlElement 
        
//  so that we know whether the nodeName is an array or not.    
        SortedList childNodeNames = new SortedList();
        
//  Add in all node attributes     
        if (node.Attributes != null)
            
foreach (XmlAttribute attr in node.Attributes)
                StoreChildNode(childNodeNames, attr.Name, attr.InnerText);
        
//  Add in all nodes     
        foreach (XmlNode cnode in node.ChildNodes)    
        {
            
if (cnode is XmlText)
                StoreChildNode(childNodeNames, 
"value", cnode.InnerText);
            
else if (cnode is XmlElement)
                StoreChildNode(childNodeNames, cnode.Name, cnode);
        }        
// Now output all stored info 
        foreach (string childname in childNodeNames.Keys)
        {
            ArrayList alChild 
= (ArrayList)childNodeNames[childname];
            
if (alChild.Count == 1)
                OutputNode(childname, alChild[
0], sbJSON, true);
            
else
            {
                sbJSON.Append(
" \"" + SafeJSON(childname) + "\": [ ");
                
foreach (object Child in alChild)
                    OutputNode(childname, Child, sbJSON, 
false);
                sbJSON.Remove(sbJSON.Length 
- 22);
                sbJSON.Append(
" ], ");
            }
        }
        sbJSON.Remove(sbJSON.Length 
- 22);
        sbJSON.Append(
" }");
    }
    
//  StoreChildNode: Store data associated with each nodeName   
    
//                  so that we know whether the nodeName is an array or not.   
    private static void StoreChildNode(SortedList childNodeNames, string nodeName, object nodeValue)
    {        
// Pre-process contraction of XmlElement-s    
        if (nodeValue is XmlElement)
        {
            
// Convert  <aa></aa> into "aa":null          
            
//          <aa>xx</aa> into "aa":"xx"       
            XmlNode cnode = (XmlNode)nodeValue;
            
if (cnode.Attributes.Count == 0)
            {
                XmlNodeList children 
= cnode.ChildNodes;
                
if (children.Count == 0)
                    nodeValue 
= null;
                
else if (children.Count == 1 && (children[0is XmlText))
                    nodeValue 
= ((XmlText)(children[0])).InnerText;
            }
        }
        
// Add nodeValue to ArrayList associated with each nodeName      
        
// If nodeName doesn't exist then add it      
        object oValuesAL = childNodeNames[nodeName];
        ArrayList ValuesAL;
        
if (oValuesAL == null)
        {
            ValuesAL 
= new ArrayList();
            childNodeNames[nodeName] 
= ValuesAL;
        }
        
else
            ValuesAL 
= (ArrayList)oValuesAL;
        ValuesAL.Add(nodeValue);
    }
    
private static void OutputNode(string childname, object alChild, StringBuilder sbJSON, bool showNodeName)
    {
        
if (alChild == null)
        {
            
if (showNodeName)
                sbJSON.Append(
"\"" + SafeJSON(childname) + "\"");
            sbJSON.Append(
"null");
        }
        
else if (alChild is string)
        {
            
if (showNodeName)
                sbJSON.Append(
"\"" + SafeJSON(childname) + "\"");
            
string sChild = (string)alChild;
            sChild 
= sChild.Trim();
            sbJSON.Append(
"\"" + SafeJSON(sChild) + "\"");
        }
        
else
            XmlToJSONnode(sbJSON, (XmlElement)alChild, showNodeName);
        sbJSON.Append(
"");
    }
    
// Make a string safe for JSON   
    private static string SafeJSON(string sIn)
    {
        StringBuilder sbOut 
= new StringBuilder(sIn.Length);
        
foreach (char ch in sIn)
        {
            
if (char.IsControl(ch) || ch == '\'')
            {
                
int ich = (int)ch;
                sbOut.Append(
@"\u" + ich.ToString("x4"));
                
continue;
            }
            
else if (ch == '\"' || ch == '\\' || ch == '/')
            { sbOut.Append(
'\\'); }

            sbOut.Append(ch);
        }
        
return sbOut.ToString();
    }
}

转载于:https://www.cnblogs.com/daiye/archive/2009/09/25/1573885.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值