您的位置:首页 > Web前端 > JavaScript

xml文件格式的类型转化为Json对象

2011-07-20 10:16 459 查看
public class xmltoJson
{

public string XmlToJSON(XmlElement xmlDoc)
{

StringBuilder sbJSON = new StringBuilder();

sbJSON.Append("{ ");

XmlToJSONnode(sbJSON, xmlDoc, true);

sbJSON.Append("}");

return sbJSON.ToString();

}

// XmlToJSONnode: Output an XmlElement, possibly as part of a higher array

public void XmlToJSONnode(StringBuilder sbJSON, XmlElement node, bool showNodeName)
{

if (showNodeName)

sbJSON.Append("\"" + SafeJSON(node.Name) + "\": ");

sbJSON.Append("{");

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 - 2, 2);

sbJSON.Append(" ], ");

}

}

sbJSON.Remove(sbJSON.Length - 2, 2);

sbJSON.Append(" }");

}

public void StoreChildNode(SortedList childNodeNames, string nodeName, object nodeValue)
{

// Pre-process contraction of XmlElement-s

if (nodeValue is XmlElement)
{

// Convert into "aa":null

// xx 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[0] is 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);

}

public 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
public 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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: