序列化相同的XML属性

时间:2011-06-24 21:20:08

标签: c# xml

我正在从类这样的类序列化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属性的类型,但我必须为所有看起来有点过分的属性执行此操作。

2 个答案:

答案 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
   }
}

此时,您的数据定义现在是动态的。您可以存储数百个元素,而无需不断更新数据存储类。

当然,我写的代码写在这里,所以它可能有拼写错误。此外,没有错误检查,所以这段代码非常危险,但我认为你得到了我的建议。