可以在每个元素上创建不同的属性

本文关键字:创建 属性 元素 | 更新日期: 2023-09-27 18:07:15

请帮忙!

我的代码是这样做的快:

[XmlRoot("monster")]
public class monster
{
    public List<flag> flags { get; set; }
}
public class flag
{
    [XmlAttribute("summonable")]
    public int summonable { get; set; }
    [XmlAttribute("attackable")]
    public int attackable { get; set; }
}
 public void XML()
 { monster monster = new monster
            {
                flags = new List<flag>
                {
                    new flag() { summonable = 0 },
                    new flag() { attackable = 0 }
                }
            };
 }

他表现得很好,我正在使用List<>:

<monster>
 <flags>
  <flag summonable="0" attackable="0" />
  <flag summonable="0" attackable="0" />
</flags>
</monster>

我需要这样:

<monster>
<flags>
    <flag summonable="0"/>
    <flag attackable="0"/>
</flags>
</monster>

感谢所有帮助过我的人…对不起,我的英语不好

可以在每个元素上创建不同的属性

首先,由于您的标志集是固定的,我不建议在您的monster类中使用List<flag>。相反,我将有一个单一的flag对象,像这样:

[XmlRoot("monster")]
public class monster
{
    public flags flags { get; set; }
}
public class flags
{
    public int summonable { get; set; }
    public int attackable { get; set; }
    // Add more as required.
}

现在,要根据需要将其序列化为XML,可以引入一个public Flag[] Flags属性,用固定属性的名称和值填充该属性。然后,可以使用属性名称和值填充[XmlAnyAttribute]属性数组,如下所示:

[XmlRoot("monster")]
public class monster
{
    public flags flags { get; set; }
}
public class flags
{
    const string SummonableName = "summonable"; // In c# 6.0 use nameof(summonable)
    const string AttackableName = "attackable"; // See  https://msdn.microsoft.com/en-us/library/dn986596.aspx
    [XmlIgnore]
    public int summonable { get; set; }
    [XmlIgnore]
    public int attackable { get; set; }
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DebuggerBrowsable(DebuggerBrowsableState.Never)]
    [XmlElement("flag")]
    public Flag[] Flags
    {
        get
        {
            return new[]
            {
                new Flag { Name = SummonableName, Value = XmlConvert.ToString(summonable) },
                new Flag { Name = AttackableName, Value = XmlConvert.ToString(attackable) },
            };
        }
        set
        {
            if (value == null)
                return;
            foreach (var attr in value)
            {
                if (attr.Name == SummonableName)
                    summonable = XmlConvert.ToInt32(attr.Value);
                else if (attr.Name == AttackableName)
                    attackable = XmlConvert.ToInt32(attr.Value);
            }
        }
    }
}
public class Flag
{
    [XmlIgnore]
    public string Name { get; set; }
    [XmlIgnore]
    public string Value { get; set; }
    [XmlAnyAttribute]
    public XmlAttribute[] XmlAttributes
    {
        get
        {
            var attr = new XmlDocument().CreateAttribute(Name.ToString());
            attr.Value = Value;
            return new [] { attr };
        }
        set
        {
            if (value == null || value.Length == 0)
            {
                Name = null;
                Value = null;
            }
            else if (value.Length == 1)
            {
                Name = value[0].Name;
                Value = value[0].Value;
            }
            else
            {
                throw new ArgumentException("Too many attributes");
            }
        }
    }
}

那么XML看起来像:

<monster>
  <flags>
    <flag summonable="0" />
    <flag attackable="0" />
  </flags>
</monster>

样本小提琴。

我想你可以做你需要通过标记flag类与abstract和派生它在两个类在以下方式:

public abstract class flag
{
}
public class summonableFlag : flag
{
    [XmlAttribute("summonable")]
    public int summonable { get; set; }
}
public class attackableFlag : flag
{
    [XmlAttribute("attackable")]
    public int attackable { get; set; }
}

然后你需要用XmlElementAttribute标记List<flag>来序列化你的项目为flag:

[XmlRoot("monster")]
public class monster
{
    [XmlElement(elementName: "flag")]
    public List<flag> flags { get; set; }
}
最后,monster对象的创建如下所示:
 monster monster = new monster
            {
                flags = new List<flag>
                {
                    new summonableFlag() { summonable = 0 },
                    new attackableFlag() { attackable = 0 }
                }
            };

在此之后,我相信你会得到所需的结果。我还没有测试过它,所以如果你在这个解决方案中有问题,请写下来。

您将属性名称与属性值混合在一起。我相信这个可以帮助你:

[XmlRoot("monster")]
public class monster
{
    public List<flag> flags { get; set; }
}
public class flag
{
    [XmlAttribute("Name")]
    public string Name { get; set; }
    [XmlAttribute("Value")]
    public string Value { get; set; }
}

public void XML() { 
    monster monster = new monster
    {
            flags = new List<flag>
            {
                new flag() { Name="summonable", Value = 0 },
                new flag() { Name="attackable", Value =0 }
            }
        };
     }

应该会产生你需要的

<monster>
 <flags>
  <flag Name="Summonable" Value="0" />
  <flag Name="Attackable" Value="0" />
</flags>
</monster>