2014-01-05 171 views
-1

下面是將XML轉換爲JSon的功能,問題是如果xml屬性值爲「001」,則返回爲「1」。但在textview中的提琴手我得到正確的價值,JSon它不是。將XML轉換爲JSon

有什麼問題?

public string StringXmltoJSon(string xmlDoc) 
{ 
    XmlDocument I_xDoc = new XmlDocument(); 
    //string strInputXml = GetDataFromStream(xmlDoc); 
    I_xDoc.LoadXml(xmlDoc); 
    StringBuilder sbJSON = new StringBuilder(); 
    sbJSON.Append("{ "); 
    XmlToJSONnode(sbJSON, I_xDoc.DocumentElement, true); 
    sbJSON.Append("}"); 
    return MSOutJson(sbJSON.ToString()); 
} 

private static Stream MSOutJson(string strjson) 
{ 
    WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8"; 
    return new MemoryStream(System.Text.Encoding.UTF8.GetBytes(strjson)); 
} 

// 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 - 2, 2); 
      sbJSON.Append(" ], "); 
     } 
    } 
    sbJSON.Remove(sbJSON.Length - 2, 2); 
    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[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); 
} 

private static void OutputNode(string childname, object alChild, StringBuilder sbJSON, bool showNodeName) 
{ 
    int number; 
    if (alChild != null && int.TryParse(alChild.ToString(), out number)) 
    { 
     alChild = alChild.ToString(); 
     if (alChild is string) 
     { 
      if (showNodeName) 
       sbJSON.Append("\"" + SafeJSON(childname) + "\": "); 
      string sChild = (string)alChild; 
      sChild = sChild.Trim(); 
      sbJSON.Append(SafeJSON(sChild)); 
     } 
     sbJSON.Append(", "); 
    } 

    else 
    { 
     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(); 
} 

回答

0

首先安裝NuGetPM> Install-Package Newtonsoft.Json
請確保您還你的文件的頂部

更新您的StringXmltoJSon看起來像這樣

public string StringXmltoJSon(string xmlDoc) 
{ 
    XmlDocument I_xDoc = new XmlDocument(); 
    I_xDoc.LoadXml(xmlDoc); 
    string jsonText = JsonConvert.SerializeXmlNode(I_xDoc); 
    return jsonText; 
} 
+0

阿什利添加到包的引用:感謝你的回答。我試過這種情況。我得到這個錯誤「名稱JsonConvert不存在於當前的上下文中」。 – user2850078

+0

@ user2850078你需要安裝nuget軟件包PM> Install-Package Newtonsoft.Json –