可以在每个元素上创建不同的属性
本文关键字:创建 属性 元素 | 更新日期: 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>