Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XmlAnyElement到XmlNode和Order属性的XmlSerialization_C#_.net_Xml_Serialization_Deserialization - Fatal编程技术网

C# 使用XmlAnyElement到XmlNode和Order属性的XmlSerialization

C# 使用XmlAnyElement到XmlNode和Order属性的XmlSerialization,c#,.net,xml,serialization,deserialization,C#,.net,Xml,Serialization,Deserialization,我在.NetXmlSerializer中遇到了一个问题,基本上我需要在固定模式的其他元素之间动态地序列化(和反序列化)一个或多个同名元素 例如: 提前感谢。尝试使用XmlArrayAttribute代替xmlanyement,因为节点是数组我同意@CharlesMager的观点,这似乎是XmlSerializer中的一个错误 也就是说,您可以通过引入一个中间包装类或结构来包含任意节点,然后修改代理nnn属性,在使用[XmlElement(“nnn”,Order=2)]标记属性后返回这些结构的

我在.Net
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