【问题标题】:Serializing the Same XML Attribute序列化相同的 XML 属性
【发布时间】:2011-06-24 21:20:07
【问题描述】:

我正在从这样的类中序列化一个 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 属性的类型,但我必须为所有看起来有点矫枉过正的属性这样做。

【问题讨论】:

  • 我猜你在用XmlSerializer?
  • 是的,我正在使用 XmlSerializer
  • 如果每个 ID 都需要是唯一的,您可以按照您的建议进行操作,创建一个新类型,或者您可以创建一个 IDS 数组,然后创建一个 NAME、ADDRESS 的枚举, ZIP,并根据枚举存储和报告这些 ID。

标签: c# xml


【解决方案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;
}

【讨论】:

    【解决方案2】:

    我认为最好的方法是创建一个通用的 StringData 类,然后让您的数据类简单地存储 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
       }
    }
    

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

    当然,我写的代码是写在这里的,所以可能有错别字。另外,没有错误检查,所以这段代码很危险,但我想你明白我的建议了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多