gpt4 book ai didi

c# - 将字符串变量传递给 XMLSerializer 的 XmlAttribute

转载 作者:太空狗 更新时间:2023-10-30 01:31:22 25 4
gpt4 key购买 nike

假设我有以下代码,并希望序列化为代码下方的 XML:

class Human
{
[XmlElement("OwnedObjects")]
public List<WorldObjects> ownedObjects;
}

class WorldObjects
{
[XmlIgnore]
public string type;
[XmlAttribute(type)]
public string name;

public WorldObjects(string _type, string _name)
{
type = _type;
name = _name;
}
}

Human bob = new Human;
bob.ownedObjects = new List<WorldObjects>;
bob.ownedObjects.Add(new WorldObjects(drink, tea));

// Serialize

XML:

<Human>
<OwnedObjects drink="tea" />
</Human>

[XmlAttribute(type)] 行将导致错误。

是否可以通过传递字符串变量来更改属性名称?

提前谢谢你。

编辑:我必须道歉,我忽略了这样一个简单的解决方案。谢谢您的回答。另外,感谢 Ben 和 dbc 建议对设计进行改进。

最佳答案

您可以使用 [XmlAnyAttribute] 以此目的。它指定成员(返回 XmlAttribute 对象数组的字段)可以包含任何 XML 属性。请注意,可以使用属性和字段来构造和返回单个属性具有所需的名称和值:

public class WorldObjects
{
[XmlAnyAttribute]
public XmlAttribute [] Attributes
{
get
{
var attr = new XmlDocument().CreateAttribute(XmlConvert.EncodeLocalName(type));
attr.Value = name;
return new[] { attr };
}
set
{
var attr = (value == null ? null : value.SingleOrDefault());
if (attr == null)
name = type = string.Empty;
else
{
type = XmlConvert.DecodeName(attr.Name);
name = attr.Value;
}
}
}

[XmlIgnore]
public string name;

[XmlIgnore]
public string type;

// XmlSerializer required parameterless constructor
public WorldObjects() : this(string.Empty, string.Empty) { }

public WorldObjects(string _type, string _name)
{
type = _type;
name = _name;
}
}

XmlConvert.EncodeLocalName() type 的情况下是必需的字符串不是 valid XML name .例如,有效的 XML 名称必须以字母而非数字开头。

示例 fiddle .

但是,使用固定属性,例如 type="drink" name="tea"如果需要,可能会更容易在以后创建 XML 模式,因此您可能会重新考虑您的设计。 [XmlAnyAttribute]对应于模式元素 xsd:anyAttribute 它允许出现任意数量的任意名称的属性。您可能希望为您的 <OwnedObjects> 指定一个任意名称的属性。元素。

关于c# - 将字符串变量传递给 XMLSerializer 的 XmlAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41737418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com