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生成实体类
复制生成的实体类,导入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字符串