class Program
{
static void Main(string[] args)
{
var me = new
{
Hello = "World",
Other = new
{
My = "Object",
V = 1,
B = (byte)2
}
};
var x = me.ToXml();
}
}
public static class Tools
{
private static readonly Type[] WriteTypes = new[] {
typeof(string), typeof(DateTime), typeof(Enum),
typeof(decimal), typeof(Guid),
};
public static bool IsSimpleType(this Type type)
{
return type.IsPrimitive || WriteTypes.Contains(type);
}
public static XElement ToXml(this object input)
{
return input.ToXml(null);
}
public static XElement ToXml(this object input, string element)
{
if (input == null)
return null;
if (string.IsNullOrEmpty(element))
element = "object";
element = XmlConvert.EncodeName(element);
var ret = new XElement(element);
if (input != null)
{
var type = input.GetType();
var props = type.GetProperties();
var elements = from prop in props
let name = XmlConvert.EncodeName(prop.Name)
let val = prop.GetValue(input, null)
let value = prop.PropertyType.IsSimpleType()
? new XElement(name, val)
: val.ToXml(name)
where value != null
select value;
ret.Add(elements);
}
return ret;
}
}
var jsonText = JsonConvert.SerializeObject(data); // convert to JSON
XmlDocument doc = JsonConvert.DeserializeXmlNode(jsonText); // convert JSON to XML Document
样品
var data = new // data - Anonymous Type
{
Request = new
{
OrderNumber = 123,
Note = "Hello World"
}
};
var jsonText = JsonConvert.SerializeObject(data);
XmlDocument doc = JsonConvert.DeserializeXmlNode(jsonText);
Console.WriteLine(doc.OuterXml);
public static class Tools
{
private static readonly Type[] WriteTypes = new[] {
typeof(string),
typeof(Enum),
typeof(DateTime), typeof(DateTime?),
typeof(DateTimeOffset), typeof(DateTimeOffset?),
typeof(int), typeof(int?),
typeof(decimal), typeof(decimal?),
typeof(Guid), typeof(Guid?),
};
public static bool IsSimpleType(this Type type)
{
return type.IsPrimitive || WriteTypes.Contains(type);
}
public static object ToXml(this object input)
{
return input.ToXml(null);
}
public static object ToXml(this object input, string element)
{
if (input == null)
return null;
if (string.IsNullOrEmpty(element))
element = "object";
element = XmlConvert.EncodeName(element);
var ret = new XElement(element);
if (input != null)
{
var type = input.GetType();
if (input is IEnumerable && !type.IsSimpleType())
{
var elements = (input as IEnumerable<object>)
.Select(m => m.ToXml(element))
.ToArray();
return elements;
}
else
{
var props = type.GetProperties();
var elements = from prop in props
let name = XmlConvert.EncodeName(prop.Name)
let val = prop.GetValue(input, null)
let value = prop.PropertyType.IsSimpleType()
? new XElement(name, val)
: val.ToXml(name)
where value != null
select value;
ret.Add(elements);
}
}
return ret;
}
}
9条答案
按热度按时间ve7v8dk21#
像这样的东西应该让你开始...
...生成xml ...
nwnhqdif2#
这不能用
XmlSerializer
或DataContractSerializer
来完成,可以通过手动编写代码来完成,如below所示(我不能评论代码是否足够全面以处理所有类型-但这是一个非常好的开始)。jm81lzqq3#
谢谢你们,马修和马丁做得很好。
我做了一些修改来适应Nullables和Enums。另外我还做了一些修改,以便数组元素根据属性+索引的名称来命名。
如果有人感兴趣的话,这是代码
w1jd8yoj4#
我知道这是一篇老文章,但是我的解决方案只需要2行代码就可以将匿名类型转换为XML。
首先将匿名类型转换为JSON,然后再从JSON转换为XML。
样品
产出
e5njpo685#
我自己的版本,然后优秀的工作@马修和@马丁:现在支持枚举数组,并且数组的概念被推广到IEnumerable中,以便也支持所有类型的集合。
odopli946#
下面的答案以我需要的方式处理IEnumerables,并将其转换为:
变成这样:
所以你看,马太福音的另一个答案是:
ebdffaop7#
我的第一篇文章,以促进一个网站,总是总是帮助了很多贝娄是一个完整的解决方案,可以使用。net核心(使用3.1测试)只需调用ConvertAnonymousToType即可。(“MyNewType”,target,out Type newType)返回将是一个对象,您可以使用该对象在控制器内返回或手动序列化(System.Xml.Serialization.XmlSerializer)。使用该对象作为返回在控制器内:1.配置服务(Startup.cs〉配置服务〉服务.添加MvcCore(选项=〉选项.输出格式化程序.添加(新的XmlSerializerOutputFormatter()));),
2.目标行动:使用[格式过滤器]和[路由(“.......{格式}”)],3.返回对象
如果任何额外的匿名类型需要组成回复(元数据、结果集等),则可以使用DynamicTypeBuilder.CreateNewObject执行服务:)
再次感谢
dohp0rv58#
另一张海报Pavel提到使用Newtonsoft.Json方法进行快速的2行转换
我建议这实际上可能是一行代码:)
jm2pwxwz9#
我发现这个页面非常有用。我正在从旧的SOAP web引用转移到.net标准支持的东西。我已经更改了代码,以便能够将其序列化为一种将与SOAP web服务一起工作的格式。虽然很粗糙,但它可以将
object[]
转换为<anyType />
元素。其他简单的数组被正确序列化,您可以传入一个名称空间,或者让它使用模型上的XmlTypeAttribute
来分配名称空间。