2014-01-05 3 views
-1

다음은 XML을 JSon으로 변환하는 함수입니다. 문제는 xml 속성 값이 "001"인 경우 "1"로 반환됩니다. 하지만 텍스트 뷰의 피 들러에서 올바른 값을 얻었습니다. 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

먼저 NuGet 패키지를 설치 PM> 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 너겟 패키지를 설치해야합니다. PM> Install-Package Newtonsoft.Json –

관련 문제