2015-09-27 2 views
1

У меня есть сгенерированный автоматически прокси-класс, который содержит поле XmlElement[] Any. В спецификации протокола допускается использование нескольких других типов. Как инициализировать это поле?Как инициализировать XmlElement []?

я мог бы, например, что-то вроде:

Any = new XmlElement[1]; 
    Any[0] = new SomeRequestType().AsXmlElement() 

Как бы освободить место для AsXmlElement в моем коде?

public partial class AppDataType 
{ 

    private System.Xml.XmlElement[] anyField; 

    private System.Xml.XmlAttribute[] anyAttrField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAnyElementAttribute(Order=0)] 
    public System.Xml.XmlElement[] Any 
    { 
     get 
     { 
      return this.anyField; 
     } 
     set 
     { 
      this.anyField = value; 
     } 
    } 
+0

См. Http://stackoverflow.com/questions/3703127/i-need-to-convert-an-xml-string-into-an-xmlelement или http://stackoverflow.com/questions/215515/creating- ан-XMLNode-XmlElement-в-с-острым-без-XmlDocument. – dbc

ответ

0

Для сериализации непосредственно от и до XmlElement, вы можете использовать:

public static class XmlNodeExtensions 
{ 
    public static XmlDocument AsXmlDocument<T>(this T o, XmlSerializerNamespaces ns = null, XmlSerializer serializer = null) 
    { 
     XmlDocument doc = new XmlDocument(); 
     using (XmlWriter writer = doc.CreateNavigator().AppendChild()) 
      new XmlSerializer(o.GetType()).Serialize(writer, o, ns); 
     return doc; 
    } 

    public static XmlElement AsXmlElement<T>(this T o, XmlSerializerNamespaces ns = null, XmlSerializer serializer = null) 
    { 
     return o.AsXmlDocument(ns, serializer).DocumentElement; 
    } 

    public static T Deserialize<T>(this XmlElement element, XmlSerializer serializer = null) 
    { 
     using (var reader = new ProperXmlNodeReader(element)) 
      return (T)(serializer ?? new XmlSerializer(typeof(T))).Deserialize(reader); 
    } 

    /// <summary> 
    /// Return an XmlSerializerNamespaces that disables the default xmlns:xsi and xmlns:xsd lines. 
    /// </summary> 
    /// <returns></returns> 
    public static XmlSerializerNamespaces NoStandardXmlNamespaces() 
    { 
     var ns = new XmlSerializerNamespaces(); 
     ns.Add("", ""); // Disable the xmlns:xsi and xmlns:xsd lines. 
     return ns; 
    } 
} 

public class ProperXmlNodeReader : XmlNodeReader 
{ 
    // Bug fix from http://stackoverflow.com/questions/30102275/deserialize-object-property-with-stringreader-vs-xmlnodereader 
    public ProperXmlNodeReader(XmlNode node) 
     : base(node) 
    { 
    } 

    public override string LookupNamespace(string prefix) 
    { 
     return NameTable.Add(base.LookupNamespace(prefix)); 
    } 
} 

И затем использовать его как:

 var appDataType = new AppDataType 
     { 
      Any = new[] { someRequestType.AsXmlElement() }, 
     }; 

Прототип fiddle.

Смежные вопросы