C# 使用XmlAnyElement到XmlNode和Order属性的XmlSerialization
我在.NetC# 使用XmlAnyElement到XmlNode和Order属性的XmlSerialization,c#,.net,xml,serialization,deserialization,C#,.net,Xml,Serialization,Deserialization,我在.NetXmlSerializer中遇到了一个问题,基本上我需要在固定模式的其他元素之间动态地序列化(和反序列化)一个或多个同名元素 例如: 提前感谢。尝试使用XmlArrayAttribute代替xmlanyement,因为节点是数组我同意@CharlesMager的观点,这似乎是XmlSerializer中的一个错误 也就是说,您可以通过引入一个中间包装类或结构来包含任意节点,然后修改代理nnn属性,在使用[XmlElement(“nnn”,Order=2)]标记属性后返回这些结构的
XmlSerializer
中遇到了一个问题,基本上我需要在固定模式的其他元素之间动态地序列化(和反序列化)一个或多个同名元素
例如:
提前感谢。尝试使用XmlArrayAttribute
代替xmlanyement
,因为节点是数组我同意@CharlesMager的观点,这似乎是XmlSerializer
中的一个错误
也就是说,您可以通过引入一个中间包装类或结构来包含任意节点,然后修改代理nnn
属性,在使用[XmlElement(“nnn”,Order=2)]标记属性后返回这些结构的数组,从而解决此缺陷:
[XmlRoot]
[Serializable]
public class A
{
[XmlElement("asd", Order = 1)]
public string asd { get; set; }
[XmlIgnore]
public string[] qwe { get; set; }
[XmlElement("nnn", Order = 2)]
public XmlNodeWrapper [] nnn
{
get
{
if (qwe == null)
return null;
var xml = new XmlDocument();
var nodes = new List<XmlNode>(qwe.Length);
foreach (var q in qwe)
{
var nnnTag = xml.CreateNode(XmlNodeType.Element, "nnn", null);
nnnTag.InnerText = q;
nodes.Add(nnnTag);
}
return nodes.Select(n => (XmlNodeWrapper)n.ChildNodes).ToArray();
}
set
{
if (value == null)
return;
qwe = value.Select(tag => tag.InnerText()).ToArray();
}
}
[XmlElement("aaa", Order = 3)]
public string aaa { get; set; }
}
[XmlType(AnonymousType = true)]
public struct XmlNodeWrapper
{
public static implicit operator XmlNodeWrapper(XmlNodeList nodes)
{
return new XmlNodeWrapper { Nodes = nodes == null ? null : nodes.Cast<XmlNode>().ToArray() };
}
public static implicit operator XmlNode[](XmlNodeWrapper wrapper)
{
return wrapper.Nodes;
}
// Marking the Nodes property with both [XmlAnyElement] and [XmlText] indicates that the node array
// may contain mixed content (I.e. both XmlElement and XmlText objects).
// Hat tip: https://stackoverflow.com/questions/25995609/xmlserializer-node-containing-text-xml-text
[XmlAnyElement]
[XmlText]
public XmlNode[] Nodes { get; set; }
public string InnerText()
{
if (Nodes == null)
return null;
return String.Concat(Nodes.Select(n => n.InnerText));
}
}
[XmlRoot]
[可序列化]
公共A类
{
[XmlElement(“asd”,顺序=1)]
公共字符串asd{get;set;}
[XmlIgnore]
公共字符串[]qwe{get;set;}
[XmlElement(“nnn”,顺序=2)]
公共XmlNodeWrapper[]nnn
{
得到
{
如果(qwe==null)
返回null;
var xml=新的XmlDocument();
var节点=新列表(qwe.Length);
foreach(qwe中的var q)
{
var nnnTag=xml.CreateNode(XmlNodeType.Element,“nnn”,null);
nnnTag.InnerText=q;
nodes.Add(nnnTag);
}
return nodes.Select(n=>(XmlNodeWrapper)n.ChildNodes.ToArray();
}
设置
{
如果(值==null)
返回;
qwe=value.Select(tag=>tag.InnerText()).ToArray();
}
}
[XmlElement(“aaa”,顺序=3)]
公共字符串aaa{get;set;}
}
[XmlType(AnonymousType=true)]
公共结构XmlNodeWrapper
{
公共静态隐式运算符XmlNodeWrapper(XmlNodeList节点)
{
返回新的XmlNodeWrapper{Nodes=Nodes==null?null:Nodes.Cast().ToArray()};
}
公共静态隐式运算符XmlNode[](XmlNodeWrapper)
{
返回wrapper.Nodes;
}
//使用[XmlAnyElement]和[XmlText]标记Nodes属性表示节点数组
//可能包含混合内容(即XmlElement和XmlText对象)。
//帽尖:https://stackoverflow.com/questions/25995609/xmlserializer-node-containing-text-xml-text
[xmlanyement]
[XmlText]
公共XmlNode[]节点{get;set;}
公共字符串InnerText()
{
如果(节点==null)
返回null;
返回String.Concat(Nodes.Select(n=>n.InnerText));
}
}
请注意,XmlNodeWrapper
中的节点
属性用[xmlanyement]
和[XmlText]
标记。说明了执行此操作的要求
示例。这在我看来确实像一个bug。你能详细说明一下什么是nnn
?因为你可以举个例子,但这在你的“真实”案例中可能不起作用。另请注意,在本例中,您可以简化序列化/反序列化方法,以使用StringWriter
/StringReader
。