[英]Is it possible to specify a XML node name and depth with attributes
我想将C#类结构序列化为XML并提供特定的节点名称,而不必拥有一堆嵌套类。 可以使用属性吗?
例如,说我有以下XML:
<OuterItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<InnerItem>
<ItemValue>something i need</ItemValue>
</InnerItem>
</OuterItem>
我有一个XML序列化方法,如下所示:
public static string XmlSerializeToString<T>(T value)
{
if (value == null) { return null; }
XmlSerializer serializer = new XmlSerializer(typeof(T));
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = false;
settings.OmitXmlDeclaration = true;
using (StringWriter textWriter = new StringWriter())
using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings))
{
serializer.Serialize(xmlWriter, value);
return textWriter.ToString();
}
}
我必须有这样的C#类结构吗?
public class OuterItem
{
public InnerItem InnerItem { get; set; }
}
public class InnerItem
{
public string ItemValue { get; set; }
}
或者是否可以通过这样的方式(伪代码)声明我的节点应该在XML文档中有多远:
public class OuterItem
{
[XmlNode("InnerItem\ItemValue")]
public string ItemValue { get; set; }
}
不,在XmlNode属性中不可能使用xpath或类似表达式。 您选择的控制xml序列化的属性非常有限。
您可以使用以下hack来反序列化您拥有的xml:
public class OuterItem
{
[XmlArrayItem(ElementName="ItemValue", Type=typeof(string))]
[XmlArray]
public string[] InnerItem
{
get; set;
}
}
public class Test
{
static void Main()
{
var item = new OuterItem { InnerItem = new[]{"AAA"} };
XmlSerializer ser = new XmlSerializer(typeof(OuterItem));
ser.Serialize(Console.Out,item);
}
}
这会产生以下xml:
<?xml version="1.0" encoding="utf-8"?>
<OuterItem xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<InnerItem>
<ItemValue>AAA</ItemValue>
</InnerItem>
</OuterItem>
另一种可能的解决方案是使用XmlTextAttribute,将内部xml转换为XmlNode类型的属性,并手动解析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.