C#操作XML

C#生成XML


需求

接口需要请求的字段是XML,为了方便演示,我还是攒一个类似结构的吧:

<A>
    <AB>
        <ABE>测试ABE</ABE>
        <ABF>测试ABF</ABF>
    </AB>
    <AC>
        <ACG>测试ACG</ACG>
        <ACH>测试ACH</ACH>
    </AC>
    <AD>
        <ADI>
            <ADJ>测试ADJ</ADJ>
            <ADK>测试ADK</ADK>
        </ADI>
    </AD>
</A>

操作步骤

1. 将XML转换为JSON

C#解析JSON字符串里面推荐了一款在线JSON压缩转义神器,这次推荐另一款:在线XML转JSON
这里写图片描述

2. 将JSON转换为C#实体类

C#JSON生成实体类里面推荐了一款在线JSON生成C#实体类神器,这次推荐另一款:JSON生成实体类
JSON生成实体类
在这里复制生成的实体类

复制生成的实体类,导入C#代码中:

public class AB
{
    /// <summary>
    /// 测试ABE
    /// </summary>
    public string ABE { get; set; }
    /// <summary>
    /// 测试ABF
    /// </summary>
    public string ABF { get; set; }
}

public class AC
{
    /// <summary>
    /// 测试ACG
    /// </summary>
    public string ACG { get; set; }
    /// <summary>
    /// 测试ACH
    /// </summary>
    public string ACH { get; set; }
}

public class ADI
{
    /// <summary>
    /// 测试ADJ
    /// </summary>
    public string ADJ { get; set; }
    /// <summary>
    /// 测试ADK
    /// </summary>
    public string ADK { get; set; }
}

public class AD
{
    /// <summary>
    /// 
    /// </summary>
    public ADI ADI { get; set; }
}

public class A
{
    /// <summary>
    /// 
    /// </summary>
    public AB AB { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public AC AC { get; set; }
    /// <summary>
    /// 
    /// </summary>
    public AD AD { get; set; }
}

public class Root
{
    /// <summary>
    /// 
    /// </summary>
    public A A { get; set; }
}

看完了步骤1、步骤2,有些人该问了,你这不是多此一举吗?为什么不直接用XML直接转换为实体类,我只想说我在网上没找到自动化生成的网站,要是有找到的请留言告诉一下小弟。

3. 实际使用

实际使用有两个坑:
1. 不要、不要、不要使用ROOT类,请直接使用A类,不然最后生成的XML会多一个ROOT字段
2. 每一个类都要初始化,记住是每一个类。

使用代码:

// 声明这些类的实例
A a = new A();
AB ab = new AB();
AC ac = new AC();
AD ad = new AD();
ADI adi = new ADI();
// 给ab实例内赋值
ab.ABE = "测试ABE";
ab.ABF = "";  // 这个为空,记得也要赋个值

ac.ACG = "测试ACG";
ac.ACH = "测试ACH";

adi.ADJ = "测试ADJ";
adi.ADK = "测试ADK";
// 类赋值
ad.ADI = adi;
a.AD = ad;
a.AB = ab;
a.AC = ac;

4. 实体类转换为XML

/// <summary>
/// 实体类转换为XML
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static string XmlSerialize<T>(T obj)
{           
    using (StringWriter sw = new StringWriter())
    {
        // 强制指定命名空间,覆盖默认的命名空间  
        XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
        namespaces.Add(string.Empty, string.Empty);  

        Type t = obj.GetType();
        XmlSerializer serializer = new XmlSerializer(obj.GetType());
        serializer.Serialize(sw, obj, namespaces);
        sw.Close();
        return sw.ToString();
    }
}        

注意:这里

// 强制指定命名空间,覆盖默认的命名空间
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add(string.Empty, string.Empty);

可以去掉默认生成的

xmlns:xsd=”http://www.w3.org/2001/XMLSchema” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

5. 实际使用

string strxml = XmlSerialize<A>(a);  // 最后strxml就是生成的xml字符串

猜你喜欢

转载自blog.csdn.net/Simoral/article/details/80119039