如何使用这种结构(在.net中)从XML创建XSD架构?

时间:2010-03-14 19:47:40

标签: .net xml xsd dataset orm

问题在于:我的输入是XML文件,类似于:

<BaseEntityClassInfo>
<item>
  <key>BaseEntityClassInfo.SomeField</key>
  <value>valueData1</value>
</item>
<item>
  <key>BaseEntityClassInfo.AdditionalDataClass.SomeOtherField</key>
  <value>valueData2</value>
</item>
<item>
  <key>BaseEntityClassInfo.AdditionalDataClass.AnotherClassInfo.DisplayedText</key>
  <value>valueData3</value>
</item>
...
...
</BaseEntityClassInfo>

<key>元素以某种方式描述了实体类字段和关系(在我无权访问的其他应用程序中使用),而<value>存储了我需要的实际数据。

我的目标是以编程方式从此XML生成一个类型化的数据集,然后可以将其用于创建报告。我想先从输入XML文件构建一些XSD架构,然后使用这个架构生成数据集,但我不知道该怎么做。问题是我不希望一个表中的所有数据,我需要几个基于<key>值的关系表,所以我想我需要以某种方式从XML <key>数据推断出关系结构。还有其他方法吗?我应该使用XSLT,Linq2XML吗?

那你觉得怎么样?如何做到这一点以及最佳方法是什么? 任何建议,想法和建议都非常赞赏! 任何人?在下面的评论中还有一些额外的信息......

2 个答案:

答案 0 :(得分:1)

不幸的是,您实际上无法使用任何XML工具来构建数据集,因为您需要的数据不是以XML格式存储的:它以“其他应用程序”正在使用的格式存储。如果它看起来像:

<BaseEntityClassInfo SomeField="valueData1">
  <AdditionalDataClass SomeOtherField="valueData2">
    <AnotherClassInfo DisplayedText="valueData3">
  </AdditionalDataClass>
</BaseEntityClassInfo>

然后你可以使用.Net中的标准XML处理程序,但由于它不是,你可以做的最好的事情就是将键和值作为字符串对拉出,然后编写自己的代码来将密钥解析为数据实体你需要(例如,在句点上拆分键,然后递归匹配或创建数据结构)。

答案 1 :(得分:1)

如果没有看到你所有的数据,我将不得不猜测,但看起来xml可能基于类结构:

using System;

[Serializable]
public class BaseEntityClassInfo
{
  public string SomeField {get; set;}
  public AdditionalDataClass _AdditionalDataClass {get; set;}

  public class AdditionalDataClass
  {
    public string SomeOtherField {get; set;}
    public AnotherClassInfo _AnotherClassInfo {get; set;}    
  }

  public class AnotherClassInfo
  {
    public string DisplayedText {get; set;}
  }

  public BaseEntityClassInfo BaseEntityClassInfoCreate()
  {
      BaseEntityClassInfo instance =
          new AdditionalDataClass
            {
                SomeField = "valueData1",
                _AdditionalDataClass =
                  new AdditionalDataClass
                      {
                          SomeOtherField = "ValueData2",
                          _AnotherClassInfo =
                              new AnotherClassInfo { DisplayedText = "valueData3" }
                      }
            };
      return instance;
  }

}

...然后将类结构序列化为XML。

此结构可以使用您的真实数据进行扩展,如果您最终说出

List<BaseEntityClassInfo> 

这可能是您的DataSet的DataSource。