可以在每个元素上设置不同的属性吗?
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。
需要帮助,拜托!
我的代码完成得很快:
[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。