我正在从类这样的类序列化XML文档:
<data>
<name></name>
<address></address>
<zip></zip>
....a whole bunch more elements
</data>
我希望它看起来像这样(为每个元素添加一个id属性):
<data id="">
<name id=""></name>
<address id=""></address>
<zip id=""></zip>
....a whole bunch more elements
</data>
如何设置我的类以便将id属性添加到XML中的每个元素?现在,我只是序列化我的类属性,可能看起来像这样:
public class data
{
public string name {get; set;}
public string address {get; set;}
public string zip {get; set;}
}
从this example开始,看起来我可以让我的类中的每个属性返回一个包含id属性的类型,但我必须为所有看起来有点过分的属性执行此操作。
答案 0 :(得分:1)
除了重写所有类以将字符串属性更改为包含字符串值加上id值的类之外,更简单的方法是对序列化XML进行后处理并在那里添加id。
class Program
{
const string XML = @"<data>
<name></name>
<address></address>
<zip></zip>
</data>";
static void Main(string[] args)
{
XElement xml = XElement.Parse(XML);
int id = 0;
AddIds(xml, ref id);
Console.WriteLine(xml);
}
private static void AddIds(XElement xml, ref int id)
{
xml.Add(new XAttribute("id", id.ToString()));
id++;
foreach (XElement child in xml.Elements())
{
AddIds(child, ref id);
}
}
}
如果你真的想在序列化过程中这样做,你需要添加一个如下所示的类,并用它替换所有的字符串属性。
public class StringWithId {
[XmlAttribute] public string id;
[XmlText] public string text;
}
答案 1 :(得分:0)
我认为最好的方法是创建一个通用的StringData类,然后让你的dataclass只存储一个StringData对象列表。
public class StringData
{
public StringData(string ID, string TEXT)
{
id = ID;
text = TEXT;
}
public string id {get; set;}
public string text {get; set;}
}
public class data
{
private Dictionary<string, StringData> dataList;
public data()
{
dataList = new Dictionary<string, StringData>();
}
public void setObject(string tag, string id, string text)
{
dataList[tag] = new StringData(id, text);
}
public StringData getObject(string tag)
{
return dataList[tag]; // Use TryParse for error checking here
}
public string getID(string tag)
{
return dataList[tag].id; //needs error checking
}
public string getText(string tag)
{
return dataList[tag].text; //needs error checking
}
}
此时,您的数据定义现在是动态的。您可以存储数百个元素,而无需不断更新数据存储类。
当然,我写的代码写在这里,所以它可能有拼写错误。此外,没有错误检查,所以这段代码非常危险,但我认为你得到了我的建议。