Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将XML转换为JSon到c#对象_C#_Json_Xml - Fatal编程技术网

将XML转换为JSon到c#对象

将XML转换为JSon到c#对象,c#,json,xml,C#,Json,Xml,作为DynamicDocumentsProccesor应用程序的一部分,我们必须将数千个文档从XML迁移到Json。这是我的方法 我有这个Xml <?xml version="1.0"?> <syscur_historial_schema> <strtipoobj>OM_SECCION</strtipoobj> <strnombreobj>_1_Seccion_IDENTIFICACION_DEL

作为DynamicDocumentsProccesor应用程序的一部分,我们必须将数千个文档从XML迁移到Json。这是我的方法

我有这个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>
这是我的转换器:

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;
    }
}    
公共类ConvertXmlToJson
{
/// 
///用于北约JSon的文档格式XML
///usando JsonConvert.SerializeXmlNode(文档)
/// 
/// 
/// 
公共静态字符串XmlToJsonSerializeXmlNode(字符串xmlPath、字符串nodeName、bool cleanString)
{
字符串justPath=Path.GetDirectoryName(xmlPath);
字符串json=Path.Combine(justPath,$“{Path.GetFileNameWithoutExtension(xmlPath)}.json”);
XmlDocument doc=新的XmlDocument();
if(干净字符串)
LoadXml(CleanRepeatedSpaces(File.ReadAllText(xmlPath));
其他的
doc.LoadXml(File.ReadAllText(xmlPath));
XmlNodeList节点=GetNode(doc,nodeName);
List lista=新列表();
foreach(节点中的XmlNode节点)
{
字符串jSonNode=JsonConvert.SerializeXmlNode(节点);
T obj=JsonConvert.DeserializeObject(jSonNode);
列表a.Add(obj);
}
writealText(json,JsonConvert.SerializeObject(lista));
返回json;
}
公共静态XmlNodeList GetNode(XmlDocument文档,字符串节点名)
{
XmlNodeList节点=doc.GetElementsByTagName(节点名);
返回节点;
}
}    
这个测试方法呢

[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));
}
[TestMethod]
public void Tools_ConvertXmlToJson_Tests()
{
string path=“D:\\MyXmlPath\\”;
字符串xml=Path.Combine(路径为“MyXmlFile.hist”);
字符串jsonFile=ConvertXmlToJson.XmlToJsonSerializeXmlNode(xml,“syscur\u historial\u schema”,true);
arenequal(true,File.Exists(jsonFile));
List jsonObject=JsonConvert.DeserializeObject(File.ReadAllText(jsonFile));
}
现在我的问题是我的反序列化对象总是在每个属性上返回null,我认为问题在于CDATA节点

问题

1-我做错了什么


2-如何将xml CDATA转换为Json字符串

将syscur\u historial\u模式类序列化如下:

[Serializeable]     
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; }
}
XmlSerializer serializer = new XmlSerializer(typeof(syscur_historial_schema));

StreamReader reader = new StreamReader(xmlPath);
var schema = (syscur_historial_schema)serializer.Deserialize(reader);
reader.Close();
 string json = JsonConverter.SerializeObject(schema);
然后将xml反序列化到类中,如下所示:

[Serializeable]     
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; }
}
XmlSerializer serializer = new XmlSerializer(typeof(syscur_historial_schema));

StreamReader reader = new StreamReader(xmlPath);
var schema = (syscur_historial_schema)serializer.Deserialize(reader);
reader.Close();
 string json = JsonConverter.SerializeObject(schema);
然后将模式转换为json,如下所示:

[Serializeable]     
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; }
}
XmlSerializer serializer = new XmlSerializer(typeof(syscur_historial_schema));

StreamReader reader = new StreamReader(xmlPath);
var schema = (syscur_historial_schema)serializer.Deserialize(reader);
reader.Close();
 string json = JsonConverter.SerializeObject(schema);

在将xml字符串转换为类对象之前,不必将其转换为xml文档。直接将xml字符串反序列化到类对象中。

为什么要从xml到JSON,然后再到C对象?为什么不将XML反序列化为类呢?它可能会很好地处理CData部分。@JLRishe作为迁移计划的一部分,我必须将大量文件从xml转换为json。我的XML模式非常旧。我不需要转换完整的xml。只是其中的一些节点。Tks用于您的方法。什么是可序列化属性的NS?它是一个属性…没有命名空间。在类声明上方,只需开始键入“[”,它就应该与intellisense一起出现。@dickrichie好吧……它在
系统
命名空间中。@dickrichie是的。你在[Serializeable]上的输入错误必须是[Serializeable]哈!我拼写不好。感谢上帝为intellisense和谷歌!