繁体   English   中英

如何使用XML属性指定另一个XML名称?

[英]How I can use XML attributes to specify another XML name?

我有这个XML:

<?xml version="1.0" encoding="UTF-8"?>
<doc>
   <id>19</id>
   <name>Name is here</name>
   <note>leader-it test user</note>
   <list name="products">
      <elem>
         <id>2537</id>
         <name>Product #2537</name>
         <status>Deleted</status>
         <cost>1.00</cost>
      </elem>
      <elem>
         <id>2541</id>
         <name>Product #2541</name>
         <status>Active</status>
         <cost>1.00</cost>
      </elem>
   </list>
   <list name="balance">
      <elem>
         <id>19</id>
         <project>Project 15</project>
         <balance>108046.1716</balance>
      </elem>
   </list>
   <label />
   <country>182</country>
</doc>

我正在尝试反序列化

var account = XmlHelper.ParseXml<Account>(xml_string);

public static class XmlHelper
{
    public class NamespaceIgnorantXmlTextReader : XmlTextReader
    {
         public NamespaceIgnorantXmlTextReader(TextReader reader) : base(reader) { }
         public override string NamespaceURI
        {
            get { return String.Empty; }
        }
    }

    public static T ParseXml<T>(string xml)
    {
        try
        {
            var serializer = new XmlSerializer(typeof(T));
            using (var reader = new StringReader(xml))
            {
                using (var xmlTextReader = new NamespaceIgnorantXmlTextReader(reader))
                {
                    return (T)(serializer.Deserialize(xmlTextReader));
                }
            }
        }
        catch (Exception e)
        {
            return default(T);
        }
    }
}

使用这些类:

[XmlRoot(ElementName = "doc")]
public class Account
{
    [XmlElement("id")]
    public int Id { get; set; }

    [XmlElement("name")]
    public string Name { get; set; }

    [XmlElement("note")]
    public string Note { get; set; }

    [XmlArray("list")]
    [XmlArrayItem(ElementName = "elem", Type = typeof(ProductListElement), IsNullable = false)]
    public List<ProductListElement> Products { get; set; }

    [XmlArray("list")]
    [XmlArrayItem(ElementName = "elem", Type = typeof(BalanceListElement), IsNullable = false)]
    public List<BalanceListElement> Balance { get; set; }

    [XmlElement("label")]
    public string Label { get; set; }

    [XmlElement("country")]
    public int CountryId { get; set; }
}

[Serializable]
public class ProductListElement
{
    [XmlElement("id")]
    public int ProductId { get; set; }

    [XmlElement("name")]
    public string Name { get; set; }

    [XmlElement("status")]
    public string Status { get; set; }

    [XmlElement("cost")]
    public string Cost { get; set; }
}

[Serializable]
public class BalanceListElement
{
    [XmlElement("id")]
    public int BalanceId { get; set; }

    [XmlElement("project")]
    public string Project { get; set; }

    [XmlElement("balance")]
    public string Balance { get; set; }
}

我有这个错误:

当前作用域中已经存在来自名称空间“”的XML元素“列表”。 使用XML属性为元素指定另一个XML名称或名称空间。

如何使用XML属性指定另一个XML名称?

谢谢。

您在类中有两个带有标签“ elem”的属性。 在这种情况下,无需使用数组。 请参阅以下课程:

   [XmlRoot(ElementName = "doc")]
    public class Account
    {
        [XmlElement("id")]
        public int Id { get; set; }

        [XmlElement("name")]
        public string Name { get; set; }

        [XmlElement("note")]
        public string Note { get; set; }

        [XmlElement(ElementName = "list")]
        public List<BalanceListElement> Balance { get; set; }

        [XmlElement("label")]
        public string Label { get; set; }

        [XmlElement("country")]
        public int CountryId { get; set; }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM