如何使用提供的xsd架构序列化大量对象?

时间:2011-02-16 16:59:49

标签: c# .net serialization xsd

我有大量的对象需要转换为xml,必须根据给定的XSD进行验证。

类结构不是很复杂(20个属性和2个子类列表) 即:

public class Person
{
   public string Street, Town, City, PostCode etc;
   public double Income, Tax, etc.;
   public List<Account> Accounts;
   ...
}

但是预期的xml输出复杂并且与类结构不匹配

<Person>
  <Address>
    <Street/><Town/><City/>
  </Address>
  <FinancialData>
    <Income/><Tax/>
  </FinancialData>
  <Accounts>
  <Account>
    <No>1</No>
    ...
  </Accounts>
</Person>

最好的方法是什么?

我尝试为每个对象制作XElement结构,然后将它们组合到XDocument中并保存

XElement document = new XElement("Person",               
   new XElement("Address",
      new XElement("Street", this.Street),
      new XElement("City", this.City),
   new XElement("FinancialData",
      new XElement("Income", this.Income), ...

但创建XElements的过程非常缓慢,有200个对象需要几分钟时间才能序列化50.000个对象。

我想过XmlSerializer,但是class和xsd不匹配。

更新: 我创建了自定义类,我将基类映射到它。然后使用XmlSerializer及其属性我在xml中序列化我的对象。这很快。

2 个答案:

答案 0 :(得分:0)

嗯,这个XDocument(Linq2Xml)很简单但是......

旧的DataSet怎么样? 有两种方式:

  1. 在Visual Studio中生成:

    • 将xsd添加到C#项目。
    • 从解决方案资源管理器“打开方式”中打开文件,选择DataSet Editor..yes yes ...
    • 单击DataSet并转到属性
    • 将名称设置为[your_class]并将自定义工具设置为MSDataSetGenerator
    • 现在,VS将生成代码。然后,您可以在代码中使用生成的类。
  2. 或者,从“开始”菜单 - &gt; Visual Studio - &gt; Visual Studio工具 - &gt; Visual Studio推荐提示 有XSD.EXE,可以用来生成类。


  3. 如果你想使用XmlSerializer,你可以制作一个XslCompiledTransform,用xsl样式表将xml文档从一种格式转换为另一种格式。

答案 1 :(得分:0)

我认为您可能需要考虑使用您选择的模板引擎,例如NHaml。首先,您必须创建符合模式的XML模板,然后使用模板引擎使用实际数据呈现模板。

在NHaml的情况下,它看起来大致如下:

%Person
  %Address
     %Street = person.Street
     %Town = person.Town
     %City = person.City
  ...
  %FinancialData
  - foreach (var account in person.Accounts)
    %Account
      %No
        = account.No
      ...