避免嵌套成员 xml 序列化的命名空间



请问,在序列化 ResponseMessageEnvelope 类时,有什么方便的方法可以避免嵌套成员请求的命名空间属性吗?结果 xml 不会用于反序列化。

[XmlInclude(typeof(AuthenticateRequest))]    
[XmlRoot("REQUEST",Namespace="")]
public abstract class BaseRequest
{
 ...
}
[XmlRoot("REQUEST", Namespace = "")]
public class AuthenticateRequest : BaseRequest
{
 ...
}
[XmlRoot("EXTSYSTEM", Namespace="")]
public class ResponseMessageEnvelope
{        
    public ResponseMessageEnvelope(BaseRequest request, BaseReponse response)
    {
        Request = request;
        Response = response;
    }
    [XmlElement("REQUEST", Namespace = "")]        
    public Request.BaseRequest Request
    {
        get;
        set;
    }
    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        var ns = new XmlSerializerNamespaces();
        ns.Add("", "");
        using (XmlWriter sWriter = XmlWriter.Create(sb, new XmlWriterSettings() { OmitXmlDeclaration = true ,Indent = true }))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(ResponseMessageEnvelope));
            serializer.Serialize(sWriter, this, ns);                
            return sb.ToString();
        }
    }    
}

我在基和派生类上尝试了 XmlRoot 属性的空命名空间,也为成员上的 XmlElement 尝试了空命名空间,但没有成功。谢谢你的建议。

<EXTSYSTEM>
  <REQUEST xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" p2:type="AuthenticateRequest">
  ...        
  </REQUEST>
....
</EXTSYSTEM>   

这个我想要:

<EXTSYSTEM>
  <REQUEST>
  ...        
  </REQUEST>
....
</EXTSYSTEM> 

基类属性必须使用 know 类型进行修饰,以避免在输出中出现这些声明。将 ResponseMessageEnvelope 中的请求属性更改为

[XmlElement("REQUEST")]
[XmlElement(Type = typeof(AuthenticateRequest))]
public Request.BaseRequest Request
{
    get;
    set;
}

此外,在元素/根级别不需要命名空间 = "

最后,

我通过 XmlAttributeOverrides 解决问题:

[Serializable()]   
public abstract class BaseRequest
{
...
}
[XmlRoot("EXTSYSTEM", Namespace="")]
public class ResponseMessageEnvelope
{
    [XmlElement("REQUEST")]
    public Request.BaseRequest Request
    {
        get;
        set;
    }
    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        var ns = new XmlSerializerNamespaces();
        ns.Add("", "");
        XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();
        XmlAttributes attrs = new XmlAttributes();           
        XmlElementAttribute attr = new XmlElementAttribute();
        attr.ElementName = "REQUEST";
        attr.Type = this.Request.GetType();
        attr.Namespace = "";
        attrs.XmlElements.Add(attr);
        attrOverrides.Add(typeof(ResponseMessageEnvelope), "Request", attrs);
        using (XmlWriter sWriter = XmlWriter.Create(sb, new XmlWriterSettings() { OmitXmlDeclaration = true ,Indent = true }))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(ResponseMessageEnvelope), attrOverrides);
            serializer.Serialize(sWriter, this, ns);                
            return sb.ToString();
        }
    }

最新更新