可以在每个元素上设置不同的属性吗?

It is possible to make different attributes on each element?

需要帮助,拜托!

我的代码完成得很快:

[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>

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

您将属性名称与属性值混合在一起。我相信能帮到你的是:

[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>

我想你可以通过用 abstract 标记 flag class 并按以下方式在两个 class 中导出它来做你需要的:

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 }
                }
            };

相信在这之后你会得到想要的结果。我还没有测试过,所以如果您对此解决方案有疑问,请写下来。

首先,由于您的标志集是固定的,我不建议在您的 monster class 中使用 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>

样本fiddle