2017-12-04 19 views
0

* .RESX XML 파일을 C#으로 JSON 파일로 변환하는 방법은 무엇입니까?* .RESX XML 파일을 C#에서 JSON 파일로 변환하는 방법

정규 RESX 파일이 있습니다. 예를 들어 :

<data xml:space="preserve" name="KEY_1">  
     <value>Text A</value> 
    </data> 
    <data xml:space="preserve" name="KEY_2">  
     <value>Text B</value> 
    </data> 

모든 사람이 : 데이터 일부만 관련이 변환을 위해 볼 수 있듯이

{ 
    "Texts": [ 
    { 
     "id": "KEY_1", 
     "text": "Text A" 
    }, 
    { 
     "id": "KEY_2", 
     "text": "Text B" 
    } 
    ] 
} 

:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> 
    <xsd:element name="root" msdata:IsDataSet="true"> 
     <xsd:complexType> 
     <xsd:choice maxOccurs="unbounded"> 
      <xsd:element name="metadata"> 
      <xsd:complexType> 
       <xsd:sequence> 
       <xsd:element name="value" type="xsd:string" minOccurs="0" /> 
       </xsd:sequence> 
       <xsd:attribute name="name" use="required" type="xsd:string" /> 
       <xsd:attribute name="type" type="xsd:string" /> 
       <xsd:attribute name="mimetype" type="xsd:string" /> 
       <xsd:attribute ref="xml:space" /> 
      </xsd:complexType> 
      </xsd:element> 
      <xsd:element name="assembly"> 
      <xsd:complexType> 
       <xsd:attribute name="alias" type="xsd:string" /> 
       <xsd:attribute name="name" type="xsd:string" /> 
      </xsd:complexType> 
      </xsd:element> 
      <xsd:element name="data"> 
      <xsd:complexType> 
       <xsd:sequence> 
       <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> 
       <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> 
       </xsd:sequence> 
       <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> 
       <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> 
       <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> 
       <xsd:attribute ref="xml:space" /> 
      </xsd:complexType> 
      </xsd:element> 
      <xsd:element name="resheader"> 
      <xsd:complexType> 
       <xsd:sequence> 
       <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> 
       </xsd:sequence> 
       <xsd:attribute name="name" type="xsd:string" use="required" /> 
      </xsd:complexType> 
      </xsd:element> 
     </xsd:choice> 
     </xsd:complexType> 
    </xsd:element> 
    </xsd:schema> 
    <resheader name="resmimetype"> 
    <value>text/microsoft-resx</value> 
    </resheader> 
    <resheader name="version"> 
    <value>2.0</value> 
    </resheader> 
    <resheader name="reader"> 
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 
    </resheader> 
    <resheader name="writer"> 
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 
    </resheader> 
    <data xml:space="preserve" name="KEY_1">  
     <value>Text A</value> 
    </data> 
    <data xml:space="preserve" name="KEY_2">  
     <value>Text B</value> 
    </data> 
</root> 

내가 JSON 파일이 파일을 변환해야 변형과 무관하다. 데이터

  1. 이름는 XML =>는 JSON 파일에서 ID입니다 때문이다.
  2. XML =>의 값의 JSON 파일에 있습니다.

편집 : 나는 해결책을 가지고,하지만 난 그것을

using System.Xml; 
using System.IO; 
using System.Collections.Generic; 
using System.Linq; 

namespace XMLtoJSON 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Dictionary<string, string> result = new Dictionary<string, string>(); 
      // To convert an XML node contained in string xml into a JSON string 
      var xml = File.ReadAllText(@"C:\Test\ClientLocalization.en-US.resx"); 
      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml(xml); 

      XmlNodeList node = doc.GetElementsByTagName("data"); 
      foreach (XmlNode item in node) 
      { 
       var value = item.InnerText.Trim(); 
       var keyName = item.Attributes.Cast<XmlAttribute>().FirstOrDefault(f => f.Name == "name"); 
       if (keyName != null) 
       { 
        var key = keyName.InnerText.Trim(); 
        result.Add(key, value); 
       } 
      } 

      string res = @"{ ""Text"" : [ "; 
      foreach (var item in result) 
      { 
       res += "{"; 
       res += $" \"id\":\"{item.Key}\",\"text\":\"{item.Value}\""; 
       res += "},"; 
      } 
      res = res.Remove(res.Length - 1); 
      res += @" ]} "; 
     } 

    } 
} 

답변

2

대신 XmlDocument를 사용하는, 내가 XElement을 사용합니다. XElement.Parse을 사용하여 XML을로드 한 다음 관심있는 노드를 선택하고 원하는 JSON을 미러링하는 익명 객체 구조로 형태를 정하십시오. 마지막으로 좋아하는 JSON 시리얼 라이저 (예 : Json.Net 또는 JavaScriptSerializer)를 사용하여 거기에서 JSON을 작성하십시오. JSON을 수동으로 롤하는 것은 좋지 않습니다. 오류가 발생하기 쉽습니다.

var xml = File.ReadAllText(@"C:\Test\ClientLocalization.en-US.resx"); 

var obj = new 
{ 
    Texts = XElement.Parse(xml) 
     .Elements("data") 
     .Select(el => new 
     { 
      id = el.Attribute("name").Value, 
      text = el.Element("value").Value.Trim() 
     }) 
     .ToList() 
}; 

string json = JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented); 

// OR: 
//JavaScriptSerializer jss = new JavaScriptSerializer(); 
//string json = jss.Serialize(obj); 

Console.WriteLine(json); 

바이올린 : Json.Net는`SerializeXmlNode`를 사용하여 JSON에 직접 XML로 변환 할 수있는 기능을 가지고 있지만 https://dotnetfiddle.net/ZIaCjd

+0

매우, 매우 좋은 :) – Raskolnikov

+0

고마워, 다행스럽게 도울 수있어! –

2

내가 당신에게 JSON.NET 프레임 워크를 권하고 싶습니다 더 잘 수행 할 수 있다고 생각합니다. XML을 JSON으로 또는 그 반대로 변환하기위한 내장 함수가 있습니다.

예 : 훨씬 더 LINQ 쉬운으로

string xml = @"<?xml version='1.0' standalone='no'?> 
<root> 
    <person id='1'> 
    <name>Alan</name> 
    <url>http://www.google.com</url> 
    </person> 
    <person id='2'> 
    <name>Louis</name> 
    <url>http://www.yahoo.com</url> 
    </person> 
</root>"; 

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xml); 

string jsonText = JsonConvert.SerializeXmlNode(doc); 
//{ 
// "?xml": { 
// "@version": "1.0", 
// "@standalone": "no" 
// }, 
// "root": { 
// "person": [ 
//  { 
//  "@id": "1", 
//  "name": "Alan", 
//  "url": "http://www.google.com" 
//  }, 
//  { 
//  "@id": "2", 
//  "name": "Louis", 
//  "url": "http://www.yahoo.com" 
//  } 
// ] 
// } 
//} 
+2

, 그것은이 특정 상황에 잘 작동하지 않을 것입니다. 이 경우, OP는 원래 XML의 서브 세트만을 원하며'name' 속성과'value' 요소의 이름을 각각'id'와'text'로 변경하려고합니다. 또한 데이터 행을 JSON에 XML로 대응하는 요소가없는'Texts' 배열로 표시하려고합니다. 'SerializeXmlNode'는 이런 식으로 행동을 커스터마이징 할 수있는 방법을 제공하지 않기 때문에 먼저 OP를 올바른 모양으로 만들기 위해 XML을 사전 처리해야합니다. –