Как создать схему XSD из XML с такой структурой (в .net)? - PullRequest
1 голос
/ 14 марта 2010

Вот проблема: мой ввод - это 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, который затем можно будет использовать для создания отчетов. Я думал о создании какой-то схемы XSD из входного XML-файла, а затем использовал эту схему для генерации набора данных, но я не уверен, как это сделать. Проблема в том, что мне не нужны все данные в одной таблице, мне нужно несколько таблиц со связями, основанными на значении <key>, поэтому я предполагаю, что мне нужно каким-то образом вывести реляционную структуру из данных XML <key>. Есть ли другие способы? Должен ли я использовать XSLT, Linq2XML, что-то еще?

Так что ты думаешь? Как это можно сделать и каков будет лучший подход?
Любые советы, идеи, предложения будут действительно оценены!
Кто-нибудь? Ниже приведена дополнительная информация в комментариях ...

Ответы [ 2 ]

1 голос
/ 23 марта 2010

Не видя всех ваших данных, мне придется угадывать, но похоже, что 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.

1 голос
/ 19 марта 2010

К сожалению, вы не сможете использовать какие-либо инструменты XML для создания своего набора данных, потому что нужные вам данные хранятся не в формате XML: они хранятся в формате, который использует «какое-то другое приложение». Если бы это выглядело так:

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

Тогда вы можете использовать стандартные обработчики XML в .Net, но, поскольку это не так, лучшее, что вы можете сделать, это извлечь ключ и значение в виде пар строк, а затем написать свой собственный код для анализа ключа в объектах данных. вам нужно (например, разделить ключ по периодам, а затем рекурсивно сопоставить или создать структуры данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...