微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有C#对象的前缀和命名空间

我正在尝试创建将C#类对象序列化为XML的POST函数.

我最困难的部分是将名称空间前缀添加到子根元素的子级,因此在这种情况下,请仅联系子级.

我似乎能够将前缀添加到contact的子元素上的唯一方法是通过SerializerNamespace类添加它们,但是我只能将其附加到根元素CreateContact上.

我该如何实现?

当前生成的XML:

<?xml version=\"1.0\"?>
<CreateContact xmlns:a="http://foo.co.uk/Contact" xmlns="http://foo.co.uk">
<a:contact>
<a:Email>stest@gmail.com</a:Email>
<a:FirstName>Simon</a:FirstName>
<a:LastName>Test</a:LastName>
<a:Phone>09088408501</a:Phone>
<a:Title>Mr</a:Title>
</a:contact>
</CreateContact>

序列化功能

public static void CreateContact(Contact contact)
{
    string tmp = url;
    string xml = "";
    string result = "";

    XmlDocument xd = new XmlDocument();

    var cc = new CreateContact();
    cc.contact = contact;
    var xs = new XmlSerializer(cc.GetType());

    XmlSerializerNamespaces xsn = new XmlSerializerNamespaces();
    xsn.Add("a", "http://foo.co.uk/Contact");

    using (MemoryStream ms = new MemoryStream())
    {
    xs.Serialize(ms, cc, xsn);
    ms.Position = 0;
    xd.Load(ms);
    xml = xd.InnerXml;
    }

    using (WebClient web = new WebClient())
    {
    web.Credentials = new NetworkCredential(username, password);
    web.Headers.Add("Content-Type", "application/xml");
    try
    {
        result = web.UploadString(tmp, "POST", xml);
    }
    catch (WebException ex)
    {
    }
    }
}

XML类构造:

[Serializable()]
[XmlRoot(ElementName = "CreateContact", Namespace = "http://foo.co.uk")]
public class CreateContact
{
    [XmlElement(ElementName = "contact", Namespace = "http://foo.co.uk/Contact")]
    public Contact contact { get; set; }
}

[DataContract(Name = "Contact", Namespace = "http://foo.co.uk/Contact")]
[XmlType("a")]
public class Contact
{
    [XmlElement(ElementName = "Email", Namespace = "http://foo.co.uk/Contact")]
    [DataMember(Name = "Email")]
    public string Email { get; set; }
    [XmlElement(ElementName = "FirstName", Namespace = "http://foo.co.uk/Contact")]
    [DataMember(Name = "FirstName")]
    public string Firstname { get; set; }
    [XmlElement(ElementName = "LastName", Namespace = "http://foo.co.uk/Contact")]
    [DataMember(Name = "LastName")]
    public string Lastname { get; set; }
    [XmlElement(ElementName = "Phone", Namespace = "http://foo.co.uk/Contact")]
    [DataMember(Name = "Phone")]
    public string Phone { get; set; }
    [XmlElement(ElementName = "Title", Namespace = "http://foo.co.uk/Contact")]
    [DataMember(Name = "Title")]
    public string Title { get; set; }
}

所需的XML:

<?xml version=\"1.0\"?>
<CreateContact  xmlns="http://foo.co.uk">
<contact xmlns:a="http://foo.co.uk/Contact">
<a:Email>stest@gmail.com</a:Email>
<a:FirstName>Simon</a:FirstName>
<a:LastName>Test</a:LastName>
<a:Phone>09088408501</a:Phone>
<a:Title>Mr</a:Title>
</contact>
</CreateContact>

解决方法:

正如评论中提到的,差异的原因是联系人应该在命名空间http://foo.co.uk中,而不是http://foo.co.uk/Contact中.

顺便说一句,另外一些评论

>除非您在其他地方使用DataContractSerializer,否则您可能不需要DataMember属性.
>大多数Xml *属性在这里都是多余的,可以通过继承XmlRoot来删除或合并.
>如果您只需要XML字符串,则最好将其序列化为StringWriter之类的内容,而不是序列化为流,然后加载到DOM中以获取文本(如果需要XML声明来指定utf,请参见this question) -8)

因此,您将获得如下所示的XML:

var xsn = new XmlSerializerNamespaces();
xsn.Add("a", "http://foo.co.uk/Contact");

var xs = new XmlSerializer(typeof(CreateContact));

using (var stringWriter = new StringWriter())
{
    xs.Serialize(stringWriter, cc, xsn);
    xml = stringWriter.ToString();
}

将您的类定义为:

[XmlRoot(ElementName = "CreateContact", Namespace = "http://foo.co.uk")]
public class CreateContact
{
    [XmlElement(ElementName = "contact")]
    public Contact Contact { get; set; }
}

[XmlRoot("contact", Namespace = "http://foo.co.uk/Contact")]
public class Contact
{
    public string Email { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Phone { get; set; }
    public string Title { get; set; }
}

有关完整的示例,请参见this fiddle.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。