C# 在XmlSerializer上修饰Xml类名
我需要获取以下xml:C# 在XmlSerializer上修饰Xml类名,c#,attributes,computer-science,xmlserializer,C#,Attributes,Computer Science,Xmlserializer,我需要获取以下xml: <request id="1"> <login> <username>username</username> <password>password</password> </login> </request> <request id="1"> <Content> <username>username<
<request id="1">
<login>
<username>username</username>
<password>password</password>
</login>
</request>
<request id="1">
<Content>
<username>username</username>
<password>password</password>
</Content>
</request>
用户名
密码
但是中间的xml可以更改为另一种请求类型,如
<request id="1">
<logout />
</request>
我尝试了以下方法:
[XmlRootAttribute(ElementName = "request", Namespace = "", IsNullable = false)]
public class Request<T>
{
[XmlAttributeAttribute(AttributeName = "id", Namespace = "")]
public string Id { get; set; }
public T Content { get; set; }
}
[XmlTypeAttribute(TypeName = "login", AnonymousType = true)]
public class LoginRequest
{
[XmlElementAttribute(ElementName = "username", Namespace = "")]
public string Username;
[XmlElementAttribute(ElementName = "password", Namespace = "")]
public string Password;
}
[XmlTypeAttribute(TypeName = "logout", AnonymousType = true)]
public class LogoutRequest
{
}
[XmlRootAttribute(ElementName=“request”,Namespace=”“,IsNullable=false)]
公共类请求
{
[XmlAttributeAttribute(AttributeName=“id”,Namespace=”“)]
公共字符串Id{get;set;}
公共T内容{get;set;}
}
[XmlTypeAttribute(TypeName=“login”,AnonymousType=true)]
公共类登录请求
{
[XmlElementAttribute(ElementName=“username”,Namespace=”“)]
公共字符串用户名;
[XmlElementAttribute(ElementName=“password”,Namespace=”“)]
公共字符串密码;
}
[XmlTypeAttribute(TypeName=“logout”,AnonymousType=true)]
公共类LogoutRequest
{
}
但是当我使用
var serializer = new XmlSerializer(typeof(Request<LoginRequest>));
var serializer=newxmlserializer(typeof(Request));
我得到了以下xml:
<request id="1">
<login>
<username>username</username>
<password>password</password>
</login>
</request>
<request id="1">
<Content>
<username>username</username>
<password>password</password>
</Content>
</request>
用户名
密码
如何将标记内容重命名为登录或注销
非常感谢假设您知道所有可能的请求类型,您可以使用构造函数覆盖特定类型的属性名称:
[XmlRoot(ElementName = "request", Namespace = "", IsNullable = false)]
public class Request
{
[XmlAttributeAttribute(AttributeName = "id", Namespace = "")]
public string Id { get; set; }
[XmlElement("login", Type = typeof(LoginRequestData))]
[XmlElement("logout", Type = typeof(LogoutRequestData))]
public BaseRequestData RequestData { get; set; }
public TRequestData GetRequestData<TRequestData>() where TRequestData : BaseRequestData
{
return RequestData as TRequestData;
}
}
public abstract class BaseRequestData
{
}
public class LoginRequestData : BaseRequestData
{
[XmlElementAttribute(ElementName = "username", Namespace = "")]
public string Username;
[XmlElementAttribute(ElementName = "password", Namespace = "")]
public string Password;
}
public class LogoutRequestData : BaseRequestData
{
}
public class SomeUnknownRequestData : BaseRequestData
{
}
xml1
看起来像:
<?xml version="1.0" encoding="utf-16"?>
<request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<login>
<username>foo</username>
<password>bar</password>
</login>
</request>
<?xml version="1.0" encoding="utf-16"?>
<request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<logout />
</request>
这是你想要的吗?我消除了简单性要求的一般性