As part of dynamic documents proccesor app we must migrate thousands of documents from XML to Json. This is my approach.
I have this Xml
<?xml version="1.0"?>
<syscur_historial_schema>
<strtipoobj>OM_SECCION</strtipoobj>
<strnombreobj>_1_Seccion_IDENTIFICACION_DEL_PACIENTE</strnombreobj>
<numobj>0.00</numobj>
<txtpropsobj/>
<txtprostit><![CDATA[BackColor = 14171687,BorderStyle = 0,FontBold = .F.,FontItalic = .F.,FontName = "Tahoma",FontSize = 9,FontUnderline = .F.,ForeColor = 0,AutoSize = .F.,BackStyle = 1,LineColor = 14171687, TitleWidth=100, CAPTION="IDENTIFICACION DEL PACIENTE"]]>
</txtprostit>
<strencabezado>IDENTIFICACION DEL PACIENTE</strencabezado>
</syscur_historial_schema>
I converted it to JSon:
Then I need to deserialize that JSon into this c# class:
public class syscur_historial_schema
{
public string strtipoobj { get; set; }
public string strnombreobj { get; set; }
public string numobj { get; set; }
public string txtpropsobj { get; set; }
public string txtprostit { get; set; }
public string strencabezado { get; set; }
}
This is my Converter:
public class ConvertXmlToJson
{
/// <summary>
/// Convierte un archivo con formato XML en fornato JSon
/// usando JsonConvert.SerializeXmlNode(doc)
/// </summary>
/// <param name="xmlPath"></param>
/// <returns></returns>
public static string XmlToJsonSerializeXmlNode<T>(string xmlPath, string nodeName, bool cleanString)
{
string justPath = Path.GetDirectoryName(xmlPath);
string json = Path.Combine(justPath, $"{Path.GetFileNameWithoutExtension(xmlPath)}.json");
XmlDocument doc = new XmlDocument();
if (cleanString)
doc.LoadXml(CleanRepeatedSpaces(File.ReadAllText(xmlPath)));
else
doc.LoadXml(File.ReadAllText(xmlPath));
XmlNodeList nodes = GetNode(doc, nodeName);
List<T> lista = new List<T>();
foreach (XmlNode node in nodes)
{
string jSonNode = JsonConvert.SerializeXmlNode(node);
T obj = JsonConvert.DeserializeObject<T>(jSonNode);
lista.Add(obj);
}
File.WriteAllText(json, JsonConvert.SerializeObject(lista));
return json;
}
public static XmlNodeList GetNode(XmlDocument doc, string nodeName)
{
XmlNodeList nodes = doc.GetElementsByTagName(nodeName);
return nodes;
}
}
And this test Method
[TestMethod]
public void Tools_ConvertXmlToJson_Tests()
{
string path = "D:\\MyXmlPath\\";
string xml = Path.Combine(path, "MyXmlFile.hist");
string jsonFile = ConvertXmlToJson.XmlToJsonSerializeXmlNode<syscur_historial_schema>(xml, "syscur_historial_schema",true);
Assert.AreEqual(true, File.Exists(jsonFile));
List<syscur_historial_schema> jsonObject = JsonConvert.DeserializeObject<List<syscur_historial_schema>>(File.ReadAllText(jsonFile));
}
Now my problem is my Deserialized object always return null on every property, I was thinking the problem is CDATA node.
Questions
1- What I'm doing wrong ?
2- How to convert xml CDATA to Json string ?
