【问题标题】:How to create XSD schema from XML with this kind of structure (in .net)?如何使用这种结构(在 .net 中)从 XML 创建 XSD 模式?
【发布时间】:2011-01-27 11:04:33
【问题描述】:

问题来了:我的输入是 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>

&lt;key&gt; 元素以某种方式描述实体类字段和关系(用于我无权访问的其他应用程序),&lt;value&gt; 存储我需要的实际数据。

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

那你怎么看?如何做到这一点,最好的方法是什么?
任何建议、想法、建议都会真正感激不尽!
任何人?下面的 cmets 中还有一些其他信息...

【问题讨论】:

  • 您使用的是哪个版本的 .NET?
  • 呃。为什么这篇文章的作者决定在 XML 中实现 Entity-Attribute-Value ? XML 的设计主要是为了消除这种混乱。
  • @Aaronaught 我同意,这很丑陋而且毫无意义,但不幸的是我得到了...
  • 是否还有其他信息,例如列类型?还是它们都只是字符串?
  • @Aaronaught 据我所知只有字符串

标签: .net xml xsd dataset orm


【解决方案1】:

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

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

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

【讨论】:

  • “与DataSet生成的默认XML不匹配”和“不是XML格式的数据”之间存在相当大的差距。
【解决方案2】:

没有看到你所有的数据,我不得不猜测,但看起来 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> 

这可能是您的数据集的数据源。

【讨论】:

  • 你对类结构是正确的,但我需要以某种方式从这个混乱中构造 xsd 模式,而不仅仅是用数据填充数据集....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
相关资源
最近更新 更多