কীভাবে JSON কে XML বা XML- এ JSON রূপান্তর করবেন?


282

আমি JSON.NET ব্যবহার করতে শুরু করেছি JSON ফর্ম্যাটে একটি স্ট্রিংকে অবজেক্ট বা বিপরীতে রূপান্তর করতে। আমি জসন.এনইটি ফ্রেমওয়ার্কে নিশ্চিত নই, জেএসওএন-এ কোনও স্ট্রিংকে এক্সএমএল ফর্ম্যাট এবং বিপরীতে রূপান্তর করা সম্ভব?


স্টেক্সম্যান যেমন বলেছে তেমন দ্রষ্টব্য। উপাদান নোডে স্থান, এটি এক্সএমএল দ্বারা উপেক্ষা করা হবে। প্রাক্তন জন্য। "স্টুডেন্ট আইডি": ১১০০০ সম্পত্তির নামে এক্সএমএল ফলাফল বিসিউজে হবে না। xml এলিমেন্ট নোডের মধ্যে স্থান থাকা গ্রহণ করে না।
ড্যানিয়েল বি

উত্তর:


424

হ্যাঁ. এই সুনির্দিষ্ট উদ্দেশ্যে সহায়তার পদ্ধতি রয়েছে এমন জসনকনভার্ট ক্লাস ব্যবহার করা:

// To convert an XML node contained in string xml into a JSON string   
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc);

// To convert JSON text contained in string json into an XML node
XmlDocument doc = JsonConvert.DeserializeXmlNode(json);

ডকুমেন্টেশন এখানে: JSON.NET এর সাথে JSON এবং XML এর মধ্যে রূপান্তর


3
এই ক্লাসটি আমি খুঁজে পেলাম না। আমি নিউটনসফট জসননট ২.৩ ব্যবহার করি।
ডেভিড.চু.সি.এ

3
এটি উপস্থিত হয় যে এই কার্যকারিতাটি JSON.NET 3.5 এ নিউটোনসফট.জসন.কনভার্টরস.এক্সএমএল নোডকনভার্টার ক্লাসে সরানো হয়েছে: জেমস.নিউটনকিং
ডেভিড ব্রাউন

3
শুধু এফওয়াইআই, এখানে একটি সম্ভাব্য সমস্যা রয়েছে। আমি যখন জসনকে এক্সএমএল নোডের একটি অ্যারে ঘুরিয়ে দিচ্ছিলাম তখন এটি জসন-এ একটি অ্যারে তৈরি করছিল। তবে, যখন আমি এক্সএমএল নোডের অ্যারে দিয়ে চলেছি যার একটি গণনা রয়েছে 1, তখন জসন রূপান্তর আর অ্যারে বিন্যাস করে না। একটি একক উপাদান সহ একটি এক্সএমএল অ্যারে এখানে অনুবাদে হারিয়ে যায়।
লেভিটিকন

3
আশ্চর্য অবাক করা - এটি এক্সএমএল এবং জেএসএনের মধ্যে প্রতিবন্ধকতা এবং এটির কারণেই এটি (আইএমও) দুজনের মধ্যে সরাসরি রূপান্তর করা ভাল ধারণা নয় । তবে, আরে, প্রচুর ডেভস রয়েছে যারা এখানে
দৃ strongly়ভাবে

7
@ স্ট্যাকসম্যান: আমি মনে করি সকলেই সম্মত হতে পারে যে জেএসওএন ফর্ম্যাটে কোনও এক্সএমএল ডকুমেন্ট উপস্থাপনের কোনও মানক উপায় নেই। আপনার উত্তর সম্ভবত হ্রাস পেয়েছিল কারণ এটি আসলে প্রশ্নের উত্তর দেয়নি। ওপি তাকে জিজ্ঞাসাবাদ করে নি যে তার রূপান্তরটি করা উচিত কিনা , বরং তিনি যদি ইতিমধ্যে তার হাতে থাকা সরঞ্জামগুলির সাহায্যে এটি করতে পারেন।
ডেভিড ব্রাউন

46

হ্যাঁ, আপনি এটি করতে পারেন (আমি করি) তবে রূপান্তর করার সময় কিছু প্যারাডক্স সম্পর্কে সচেতন থাকুন এবং যথাযথভাবে পরিচালনা করুন। আপনি সমস্ত ইন্টারফেস সম্ভাবনার সাথে স্বয়ংক্রিয়ভাবে মেনে চলতে পারবেন না, এবং রূপান্তর নিয়ন্ত্রণে সীমিত অন্তর্নির্মিত সমর্থন রয়েছে- অনেক JSON কাঠামো এবং মানগুলি স্বয়ংক্রিয়ভাবে উভয় উপায়ে রূপান্তর করা যায় না। মনে রাখবেন আমি নিউটসনফট জেএসওএন লাইব্রেরি এবং এমএস এক্সএমএল লাইব্রেরির সাথে ডিফল্ট সেটিংস ব্যবহার করছি, তাই আপনার মাইলেজটি পৃথক হতে পারে:

এক্সএমএল -> জেএসএন

  1. সমস্ত ডেটা স্ট্রিং ডেটা হয়ে (উদাহরণস্বরূপ আপনি সবসময় পাবেন "FALSE" না মিথ্যা বা "0" না 0 ) স্পষ্টতই জাভাস্ক্রিপ্ট নির্দিষ্ট ক্ষেত্রে ভিন্নভাবে এই একইরূপে।
  2. শিশুদের উপাদানগুলি কেবলমাত্র এক বা একাধিক এক্সএমএল শিশু-উপাদান থাকা অবস্থায় নেস্টেড-অবজেক্ট {}বা নেস্টেড-অ্যারেতে পরিণত হতে পারে [ {} {} ...]। আপনি এই দুটি জাভাস্ক্রিপ্টে আলাদাভাবে গ্রাস করবেন ইত্যাদি। একই স্কিমার সাথে মেনে চলার এক্সএমএলের বিভিন্ন উদাহরণ আসলে এইভাবে বিভিন্ন জেএসএন কাঠামো তৈরি করতে পারে। আপনি কিছুটা (তবে অগত্যা সমস্ত নয়) ক্ষেত্রে এটিকে জড়িত করতে আপনার উপাদানটিতে json: অ্যারে = 'ট্রু' যুক্ত করতে পারেন।
  3. আপনার এক্সএমএল অবশ্যই মোটামুটি সুগঠিত হওয়া উচিত , আমি লক্ষ্য করেছি যে এটি ডাব্লু 3 সি স্ট্যান্ডার্ডের সাথে পুরোপুরি মেনে চলার দরকার নেই, তবে 1. আপনার অবশ্যই একটি মূল উপাদান থাকতে হবে এবং ২. আপনি সংখ্যার সাথে উপাদানগুলির নাম শুরু করতে পারবেন না জোর করা এক্সএমএল দুটি মান are নিউটনসফট এবং এমএস লাইব্রেরি ব্যবহার করার সময় আমি খুঁজে পেয়েছি।
  4. পুরানো সংস্করণগুলিতে, ফাঁকা উপাদানগুলি JSON এ রূপান্তর করে না। তারা উপেক্ষা করা হয়। একটি ফাঁকা উপাদান "উপাদান" হয়ে যায় না : নাল

একটি নতুন আপডেট এটি পরিবর্তন করে (এটি নির্দেশ করার জন্য জোন স্টোরিকে ধন্যবাদ): https://www.newtonsoft.com/json/help/htML/T_Newtonsoft_Json_NullValueHandling.htm

জেএসএন -> এক্সএমএল

  1. আপনার একটি শীর্ষ স্তরের অবজেক্ট দরকার যা মূলের XML এলিমেন্টে রূপান্তর করবে বা পার্সার ব্যর্থ হবে।
  2. আপনার অবজেক্টের নামগুলি কোনও সংখ্যার সাথে শুরু করতে পারে না, কারণ এগুলিকে উপাদানগুলিতে রূপান্তর করা যায় না (এক্সএমএল প্রযুক্তিগতভাবে এর চেয়ে আরও বেশি কঠোর) তবে আমি অন্যান্য কিছু নামকরণের নিয়ম ভেঙে 'পালিয়ে যেতে' পারি।

আপনি খেয়াল করেছেন এমন যে কোনও সমস্যা উল্লেখ করার জন্য নির্দ্বিধায় দ্বিধা করুন, আমি পিছনে রূপান্তর করার সাথে সাথে স্ট্রিং প্রস্তুত ও পরিষ্কার করার জন্য আমার নিজস্ব কাস্টম রুটিনগুলি বিকাশ করেছি। আপনার পরিস্থিতি প্রিপ / ক্লিনআপের জন্য কল করতে পারে বা নাও পারে। স্ট্যাকসম্যান যেমন উল্লেখ করেছে, আপনার অবস্থার জন্য আসলে আপনার প্রয়োজন হতে পারে যে আপনি বস্তুর মধ্যে রূপান্তর করুন ... এটি উপরে উল্লিখিত ক্যাভেটগুলি পরিচালনা করতে উপযুক্ত ইন্টারফেস এবং একাধিক মামলার বিবৃতি / ইত্যাদি জড়িত থাকতে পারে।


এই! আমার সংক্ষিপ্ত (এবং কোনও সময়ে ভারীভাবে নিম্নোক্ত) জবাব কী ছিল তার সুন্দর বর্ধনের উপর ভিত্তি করে - আপনি অন্ধভাবে সরাসরি রূপান্তরটি করেন তবে অনেকগুলি, অনেক ক্ষতি রয়েছে। তারা নির্দিষ্ট ব্যবহারের জন্য সমস্যাগুলি ব্লক করে নাও থাকতে পারে, তবে অন্যের পক্ষে এটি খুব খারাপ লাগবে।
স্টেক্সম্যান 21

1
এক্সএমএলে # 4 সম্পর্কিত -> জেএসওএন: নাল মানগুলি স্পষ্টভাবে অন্তর্ভুক্ত করা উচিত তা নির্দিষ্ট করতে আপনি নালভ্যালুহ্যান্ডলিং সম্পত্তি ব্যবহার করতে পারেন - newtonsoft.com/json/help/html/…
জোন স্টোরি

এই ভাষ্যটিতে সমস্যার বিবরণটি আলগোরিদিমগুলির সমস্ত বাস্তবায়নের ক্ষেত্রে প্রযোজ্য যা জেএসএনকে এক্সএমএল বা বিপরীতে রূপান্তর করে। একবার যখন কেউ মেনে নেয় যে এটি একইসাথে নিখুঁত দ্বি-দিকনির্দেশক বিশ্বস্ততা অর্জন করা সম্ভব নয় এবং একই সাথে ইথার "পার্টি" বা "সীমাবদ্ধ" (প্রাক-নির্ধারিত স্কিমা / ফর্ম্যাট) ইনপুট এবং আউটপুট। - সাধারণ ক্ষেত্রে।
ডালডিআই

33

। নেট ফ্রেমওয়ার্কের সাহায্যে আপনি এই রূপান্তরগুলি করতে পারেন:

জেএসএন টু এক্সএমএল: সিস্টেম.রুনটাইম.সরিয়ালাইজেশন.জসন ব্যবহার করে

var xml = XDocument.Load(JsonReaderWriterFactory.CreateJsonReader(
    Encoding.ASCII.GetBytes(jsonString), new XmlDictionaryReaderQuotas()));

এক্সএমএল টু জেএসওএন: সিস্টেম.ওয়েব.স্ক্রিপ্ট.শিরাইজেশন ব্যবহার করে

var json = new JavaScriptSerializer().Serialize(GetXmlData(XElement.Parse(xmlString)));

private static Dictionary<string, object> GetXmlData(XElement xml)
{
    var attr = xml.Attributes().ToDictionary(d => d.Name.LocalName, d => (object)d.Value);
    if (xml.HasElements) attr.Add("_value", xml.Elements().Select(e => GetXmlData(e)));
    else if (!xml.IsEmpty) attr.Add("_value", xml.Value);

    return new Dictionary<string, object> { { xml.Name.LocalName, attr } };
}

গেটএক্সএমএলডেটাতে আমি একটি ত্রুটি পেয়েছি "বর্তমানের প্রসঙ্গে 'গেটএক্সএমএল ডেটা' নামটি বিদ্যমান নেই" আমি কি অনুপস্থিত এমন কোনও নির্দেশিকা ব্যবহার করছি?
টিমস্মিথ-আয়ারডলফ

4
@ টিমস্মিথ-আয়ারডল্ফ, আপনার প্রয়োজনীয় সমস্ত কোড এখানে রয়েছে। System.Web.Script.Serialization ব্যবহারের জন্য রেফারেন্সগুলিতে System.Web.E এক্সটেনশনগুলি সমাবেশ যুক্ত করা দরকার ।
টার্মিনিনজা

@ টার্মিনিনজা, জেএসওন থেকে এক্সএমএল আমাকে টাইপ দিচ্ছেন, কীভাবে তা সরিয়ে ফেলবেন?
ক্র্যাকার

@ টারমিনিঞ্জ, নিখুঁত, ধন্যবাদ
ক্র্যাকার

30

আমি নিশ্চিত নই যে এই ধরণের রূপান্তরটির কোনও বিন্দু রয়েছে (হ্যাঁ, অনেকে এটি করেন তবে বেশিরভাগ ক্ষেত্রে বৃত্তাকার ছিদ্রটি বৃত্তাকার ছিদ্র দিয়ে জোর করে দেওয়া হয়) - কাঠামোগত প্রতিবন্ধকতা মিল নেই, এবং রূপান্তরটি ক্ষয়ক্ষতিযুক্ত। সুতরাং আমি এই ধরনের বিন্যাস থেকে বিন্যাস রূপান্তর বিরুদ্ধে সুপারিশ করব।

তবে আপনি যদি এটি করেন তবে প্রথমে জসন থেকে অবজেক্টে রূপান্তর করুন, তারপরে অবজেক্ট থেকে এক্সএমএল (এবং বিপরীত দিকের বিপরীতে)। সরাসরি রূপান্তর করা কুৎসিত আউটপুট, তথ্য হ্রাস, বা উভয়ই হতে পারে।


1
যদিও আপনার উত্তরটি নষ্ট হয়ে গেছে, আমি এখানে এসে আনন্দিত। আমি রূপান্তরটি করতে চাই এবং সি # মিডিল অবজেক্টগুলি এড়িয়ে যাওয়ার কথা ভাবছিলাম, তবে এখন এতটা নিশ্চিত নয়। আমার অন্যথায় এক্সএসডি এর উপর ভিত্তি করে সি # অবজেক্ট তৈরি করা দরকার এবং যেহেতু এটি কেবল রূপান্তরকরণের উদ্দেশ্যেই এটি নষ্ট স্তর (এবং প্রচেষ্টা) বলে মনে হয়েছিল। যদি আপনার কাছে উদাহরণ বা আরও বিশদ থাকে যে এটি কীভাবে ক্ষয়ক্ষতি হয় তা দেখতে দুর্দান্ত।
ক্রিস

কেন এটিকে নিম্নমান দেওয়া হয়েছে জানি না। আমি বর্তমানে বেশ কয়েকটি এক্সএমএল সম্পর্কিত জাগুলি সংশোধন করছি <-> জেএসওএন আমাদের একটি পণ্যতে রূপান্তরকারী পদক্ষেপগুলি। জেএসএন থেকে এক্সএমএল রূপান্তর করার সময় বেশিরভাগ সংখ্যার প্রকারের ক্ষয় হয়।
rikkit

কঠিন সত্য, দরকারী উত্তর।
ব্যর্থ ইউনাইটটেষ্ট

@ ক্রিস বছরগুলি অনেক দেরি হয়ে গেছে, তবে স্থানান্তর বস্তুগুলি থাকা এক্সএমএল স্কিমা কিছুটা হলেও সংরক্ষণ করে। উদাহরণস্বরূপ, লেভিটিকন দ্বারা উত্থাপিত হিসাবে , আপনি যদি কোনও একএমএল ডকুমেন্টকে একটি একক উপাদান অ্যারের সাথে রূপান্তর করার চেষ্টা করেন, জেএসএন রূপান্তরটি জানতে পারবেন না যে এটি অ্যারে টাইপের সাথে কোনও ট্রান্সফার অবজেক্ট থেকে আগত না হলে এটি অ্যারে।
jpaugh

1
জেএসএন থেকে এক্সএমএল থেকে জেএসএন- তে ফিরে ট্রান্সফার করার সময় নিউটোনসফট.জেএসনের এক্সএমএলনোড কনভার্টারের কাছে এই সমস্যাটি এড়াতে একটি কনফিগার বিকল্প রয়েছে , তবে এটির মূল বিন্যাসটি এক্সএমএল যেখানে পাওয়া যায় না
jpaugh

27

ডেভিড ব্রাউন এর উত্তরের জন্য ধন্যবাদ । আমার JSON.Net 3.5 এর ক্ষেত্রে, রূপান্তর পদ্ধতিগুলি জসনকনভার্ট স্থিত শ্রেণীর অধীনে রয়েছে:

XmlNode myXmlNode = JsonConvert.DeserializeXmlNode(myJsonString); // is node not note
// or .DeserilizeXmlNode(myJsonString, "root"); // if myJsonString does not have a root
string jsonString = JsonConvert.SerializeXmlNode(myXmlNode);

4
যদি আপনার ডেটা অ্যারে হয় তবে আপনাকে এর মতো কিছু করতে হবে: জসনকনভার্ট.ডিজরিয়ালাইজ এক্সএমএল নোড ("{\" রো \ ":" + জসন + "}", "রুট")। কেবল কোনও জেএসএনকে রূপান্তর করতে পারে যা কোনও বস্তুর সাথে শুরু হয়। " ব্যতিক্রম।
মিচেল স্কর্ণিক

হ্যাঁ, এবং আপনি কোনও সংখ্যা দিয়ে শুরু করতে পারবেন না। JsonConvert.DeserializeXmlNode ( "{\" 1Row \ ":" + + JSON + + "}", "রুট") ToXmlString () ব্যর্থ হবে।
DaFi4

উপরের উত্তর এবং @ মাইচেল মন্তব্য আমাকে সাহায্য করে .. ধন্যবাদ
অজয় 2707

8

বহিরাগত সমাবেশ / প্রকল্পটি ব্যবহার না করার আশায় গ্রহণযোগ্য সমাধানের বিকল্প কোড খুঁজতে আমি দীর্ঘ সময় অনুসন্ধান করেছি। ডায়নামিকজেসন প্রকল্পের উত্স কোডটির জন্য আমি নিম্নলিখিত ধন্যবাদটি নিয়ে এসেছি :

public XmlDocument JsonToXML(string json)
{
    XmlDocument doc = new XmlDocument();

    using (var reader = JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(json), XmlDictionaryReaderQuotas.Max))
    {
        XElement xml = XElement.Load(reader);
        doc.LoadXml(xml.ToString());
    }

    return doc;
}

দ্রষ্টব্য: আমি এক্সপ্যাথ উদ্দেশ্যে XElement এর চেয়ে একটি এক্সএমএল ডকুমেন্ট চেয়েছিলাম। এছাড়াও, এই কোডটি স্পষ্টতই কেবল JSON থেকে XML এ যায়, বিপরীত করার বিভিন্ন উপায় রয়েছে।


1
আমার সম্প্রতি এসকিউএলসিআরআরতে এটি করা দরকার ছিল এবং একটি নির্ভরতা নিতে পারি নি তাই আমি কেবল বুলেটটি বিট করেছিলাম এবং এই জসন-টু-এক্সএমএল রূপান্তর রুটিনটি লিখেছিলাম , এটি আশ্চর্যজনকভাবে সহজ এবং প্রায় 20 লাইনের কোড ছিল।
গর্ডি

এক্সএমএল থেকে টাইপার কীভাবে সরাবেন?
ক্র্যাকার

6

এক্সএমএলকে জসনতে রূপান্তর করতে এখানে পুরো সি # কোড দেওয়া আছে

public static class JSon
{
public static string XmlToJSON(string xml)
{
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);

    return XmlToJSON(doc);
}
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<string, object> childNodeNames = new SortedList<string, object>();

    //  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)
    {
        List<object> alChild = (List<object>)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<string, object> 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
    List<object> ValuesAL;

    if (childNodeNames.ContainsKey(nodeName))
    {
        ValuesAL = (List<object>)childNodeNames[nodeName];
    }
    else
    {
        ValuesAL = new List<object>();
        childNodeNames[nodeName] = ValuesAL;
    }
    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();
 }
}

প্রদত্ত XML স্ট্রিংটিকে JSON এ রূপান্তর করতে, কেবল নীচের মত XMLToJSON () ফাংশনটি কল করুন।

string xml = "<menu id=\"file\" value=\"File\"> " +
              "<popup>" +
                "<menuitem value=\"New\" onclick=\"CreateNewDoc()\" />" +
                "<menuitem value=\"Open\" onclick=\"OpenDoc()\" />" +
                "<menuitem value=\"Close\" onclick=\"CloseDoc()\" />" +
              "</popup>" +
            "</menu>";

string json = JSON.XmlToJSON(xml);
// json = { "menu": {"id": "file", "popup": { "menuitem": [ {"onclick": "CreateNewDoc()", "value": "New" }, {"onclick": "OpenDoc()", "value": "Open" }, {"onclick": "CloseDoc()", "value": "Close" } ] }, "value": "File" }}

3

এই ফাংশন চেষ্টা করুন। আমি কেবল এটি লিখেছি এবং এটি পরীক্ষার খুব বেশি সুযোগ পাইনি, তবে আমার প্রাথমিক পরীক্ষাগুলি আশাব্যঞ্জক।

public static XmlDocument JsonToXml(string json)
{
    XmlNode newNode = null;
    XmlNode appendToNode = null;
    XmlDocument returnXmlDoc = new XmlDocument();
    returnXmlDoc.LoadXml("<Document />");
    XmlNode rootNode = returnXmlDoc.SelectSingleNode("Document");
    appendToNode = rootNode;

    string[] arrElementData;
    string[] arrElements = json.Split('\r');
    foreach (string element in arrElements)
    {
        string processElement = element.Replace("\r", "").Replace("\n", "").Replace("\t", "").Trim();
        if ((processElement.IndexOf("}") > -1 || processElement.IndexOf("]") > -1) && appendToNode != rootNode)
        {
            appendToNode = appendToNode.ParentNode;
        }
        else if (processElement.IndexOf("[") > -1)
        {
            processElement = processElement.Replace(":", "").Replace("[", "").Replace("\"", "").Trim();
            newNode = returnXmlDoc.CreateElement(processElement);
            appendToNode.AppendChild(newNode);
            appendToNode = newNode;
        }
        else if (processElement.IndexOf("{") > -1 && processElement.IndexOf(":") > -1)
        {
            processElement = processElement.Replace(":", "").Replace("{", "").Replace("\"", "").Trim();
            newNode = returnXmlDoc.CreateElement(processElement);
            appendToNode.AppendChild(newNode);
            appendToNode = newNode;
        }
        else
        {
            if (processElement.IndexOf(":") > -1)
            {
                arrElementData = processElement.Replace(": \"", ":").Replace("\",", "").Replace("\"", "").Split(':');
                newNode = returnXmlDoc.CreateElement(arrElementData[0]);
                for (int i = 1; i < arrElementData.Length; i++)
                {
                    newNode.InnerText += arrElementData[i];
                }

                appendToNode.AppendChild(newNode);
            }
        }
    }

    return returnXmlDoc;
}

2

এখানে একটি সাধারণ স্নিপেট যা এক্সএমএমলনডকে (পুনরাবৃত্তভাবে) হ্যাশটেবলে রূপান্তর করে এবং একই সন্তানের একাধিক উদাহরণকে অ্যারে (অ্যারেলিস্ট হিসাবে) হিসাবে ভাগ করে দেয়। জ্যাশন লাইব্রেরির বেশিরভাগ দ্বারা হ্যাশটেবল সাধারণত জেএসএন রূপান্তর করতে গৃহীত হয়।

protected object convert(XmlNode root){
    Hashtable obj = new Hashtable();
    for(int i=0,n=root.ChildNodes.Count;i<n;i++){
        object result = null;
        XmlNode current = root.ChildNodes.Item(i);

        if(current.NodeType != XmlNodeType.Text)
            result = convert(current);
        else{
            int resultInt;
            double resultFloat;
            bool resultBoolean;
            if(Int32.TryParse(current.Value, out resultInt)) return resultInt;
            if(Double.TryParse(current.Value, out resultFloat)) return resultFloat;
            if(Boolean.TryParse(current.Value, out resultBoolean)) return resultBoolean;
            return current.Value;
        }

        if(obj[current.Name] == null)
            obj[current.Name] = result;
        else if(obj[current.Name].GetType().Equals(typeof(ArrayList)))
            ((ArrayList)obj[current.Name]).Add(result);
        else{
            ArrayList collision = new ArrayList();
            collision.Add(obj[current.Name]);
            collision.Add(result);
            obj[current.Name] = collision;
        }
    }

    return obj;
}

1

সিনচু ইটিএল - কয়েকটি লাইন কোডের সাহায্যে খুব সহজেই এক্সএমএলকে জেএসএনে রূপান্তর করতে উপলভুক্ত একটি ওপেন সোর্স লাইব্রেরি

এক্সএমএল -> জেএসএন:

using (var p = new ChoXmlReader("sample.xml"))
{
    using (var w = new ChoJSONWriter("sample.json"))
    {
        w.Write(p);
    }
}

জেএসন -> এক্সএমএল:

using (var p = new ChoJsonReader("sample.json"))
{
    using (var w = new ChoXmlWriter("sample.xml"))
    {
        w.Write(p);
    }
}

কিছু অতিরিক্ত সহায়তার জন্য কোডআউট কোড নিবন্ধ চেকআউট।

দাবি অস্বীকার: আমি এই গ্রন্থাগারের লেখক।


0

আমি ডেভিড ব্রাউন যেমন বলেছিলাম তেমনই করেছি তবে আমি নিম্নলিখিত ব্যতিক্রম পেয়েছি।

$exception {"There are multiple root elements. Line , position ."} System.Xml.XmlException

একটি সমাধানটি হ'ল এক্সএমএল ফাইলটিকে মূল উপাদান দিয়ে পরিবর্তন করতে হবে তবে এটি সর্বদা প্রয়োজন হয় না এবং এক্সএমএল স্ট্রিমের জন্য এটিও সম্ভব নাও হতে পারে। আমার সমাধান নীচে:

var path = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, @"..\..\App_Data"));
var directoryInfo = new DirectoryInfo(path);
var fileInfos = directoryInfo.GetFiles("*.xml");

foreach (var fileInfo in fileInfos)
{
    XmlDocument doc = new XmlDocument();
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ConformanceLevel = ConformanceLevel.Fragment;

    using (XmlReader reader = XmlReader.Create(fileInfo.FullName, settings))
    {
        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element)
            {
                var node = doc.ReadNode(reader);
                string json = JsonConvert.SerializeXmlNode(node);
            }
        }
    }
}

এক্সএমএল উদাহরণ যা ত্রুটি উত্পন্ন করে:

<parent>
    <child>
        Text
    </child>
</parent>
<parent>
    <child>
        <grandchild>
            Text
        </grandchild>
        <grandchild>
            Text
        </grandchild>
    </child>
    <child>
        Text
    </child>
</parent>

1
আপনার উদাহরণ এক্সএমএল কোনও এক্সএমএল নথি নয় কারণ এতে কোনও একক রুট নোড নেই। এটি তবে এক্সএমএল খণ্ড হতে পারে।
রবার্ট ম্যাককি

0

আমি JSON কে XML এ রূপান্তর করতে নীচের পদ্ধতিগুলি ব্যবহার করেছি

List <Item> items;
public void LoadJsonAndReadToXML() {
  using(StreamReader r = new StreamReader(@ "E:\Json\overiddenhotelranks.json")) {
    string json = r.ReadToEnd();
    items = JsonConvert.DeserializeObject <List<Item>> (json);
    ReadToXML();
  }
}

এবং

public void ReadToXML() {
  try {
    var xEle = new XElement("Items",
      from item in items select new XElement("Item",
        new XElement("mhid", item.mhid),
        new XElement("hotelName", item.hotelName),
        new XElement("destination", item.destination),
        new XElement("destinationID", item.destinationID),
        new XElement("rank", item.rank),
        new XElement("toDisplayOnFod", item.toDisplayOnFod),
        new XElement("comment", item.comment),
        new XElement("Destinationcode", item.Destinationcode),
        new XElement("LoadDate", item.LoadDate)
      ));

    xEle.Save("E:\\employees.xml");
    Console.WriteLine("Converted to XML");
  } catch (Exception ex) {
    Console.WriteLine(ex.Message);
  }
  Console.ReadLine();
}

আমি উপাদানগুলির প্রতিনিধিত্ব করতে আইটেম নামের ক্লাসটি ব্যবহার করেছি

public class Item {
  public int mhid { get; set; }
  public string hotelName { get; set; }
  public string destination { get; set; }
  public int destinationID { get; set; }
  public int rank { get; set; }
  public int toDisplayOnFod { get; set; }
  public string comment { get; set; }
  public string Destinationcode { get; set; }
  public string LoadDate { get; set; }
}

এটি কাজ করে ....


0

JSONস্ট্রিং রূপান্তর করার জন্য এটি XMLচেষ্টা করুন:

    public string JsonToXML(string json)
    {
        XDocument xmlDoc = new XDocument(new XDeclaration("1.0", "utf-8", ""));
        XElement root = new XElement("Root");
        root.Name = "Result";

        var dataTable = JsonConvert.DeserializeObject<DataTable>(json);
        root.Add(
                 from row in dataTable.AsEnumerable()
                 select new XElement("Record",
                                     from column in dataTable.Columns.Cast<DataColumn>()
                                     select new XElement(column.ColumnName, row[column])
                                    )
               );


        xmlDoc.Add(root);
        return xmlDoc.ToString();
    }

XMLএটি JSONচেষ্টা করতে রূপান্তর করার জন্য :

    public string XmlToJson(string xml)
    {
       XmlDocument doc = new XmlDocument();
       doc.LoadXml(xml);

       string jsonText = JsonConvert.SerializeXmlNode(doc);
       return jsonText;
     }

0

জেএসএন বা এক্সএমএল স্ট্রিংকে পার্স করার জন্য নিজের কোড লেখার পরিবর্তে তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করুন। যদি এটি একবার ব্যবহার করে তবে এটি অনলাইনে রূপান্তর করার চেষ্টা করুন। জসন থেকে এক্সএমএল https://www.easycodeforall.com/Json2XML.jsp এক্সএমএল থেকে জসন https://www.easycodeforall.com/XML2Json.jsp

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.