Как читать основанные на схеме XML-файлы с вложенными элементами в объекты табличного типа? - PullRequest
2 голосов
/ 13 февраля 2012

Вдобавок к Рекомендации по анализу XML-файлов? Я ищу быстрый и простой способ взять тщательно отрендеренную XML-схему и несколько построенных на ней экземпляров XML-данных и прочитатьони быстро превращаются в какой-то DataSet -подобный объект.(На самом деле это может быть что угодно с несколькими таблицами, строками и столбцами, если я могу представить их в сетках, добавить несколько столбцов, внести некоторые изменения и передать их в гранулированные объекты или базу данных, когда я закончу взаимодействовать сэто в совокупности.) Я думал, что я бы использовал XmlReader , чтобы сделать это, но его создание таблицы довольно неразумно, возможно, потому что я работаю с глобально объявленными / повторно используемыми типами в xsd?Или потому что я не реализую с правильными параметрами?

Подробный пример кода ниже.Чтобы решить эту проблему: XmlReader, похоже, не имеет возможности интерпретировать реляционную природу схемы;дочерний элемент должен быть связан со своим родителем в структуре таблицы, чтобы иметь смысл, но полученный результат этого не сделает.Читатель также не может понять, что список - это просто набор таблиц, созданный для того, чтобы избежать проблем со встречными, не связанными братьями и сестрами (хотя в примере кода их нет).

Если я хочу работать с этими данными в основном вмассовый (объекты на самом деле не требуются), каков наилучший метод с наименьшим количеством строк кода для его передачи в C # при полном соблюдении иерархической структуры, определенной в xsd и выполненной в xml?

Еще одно замечание: я не женат на XmlReader и исследовал LINQ to XML и генератор объектов xsd.exe, но оба они подразумевали написание большего количества кода (или очистку большего количества), чем я.Я бы подумал, что мне нужно сделать с точным, читаемым XSD на месте.Несколько дней назад я думал, что это будет быстрое преобразование ...


Пример схемы, сохраненной как FooSchema.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema
    targetNamespace="http://tempuri.org/FooSchema"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/FooSchema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:complexType name="FooNoteType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="dateStamp" type="xs:dateTime" use="optional" />
        <xs:attribute name="isBar" type="xs:boolean" use="optional" />
      </xs:extension>
    </xs:simpleContent>  
  </xs:complexType>
  <xs:complexType name="FooType">
    <xs:sequence>
      <xs:element name="stuff" type="xs:string" />
      <xs:element name="nonsense" type="xs:string" minOccurs="0" />
      <xs:element name="note" type="FooNoteType" minOccurs="0" />
    </xs:sequence>
    <xs:attribute name="isBar" type="xs:boolean" use="required" />
  </xs:complexType>
  <xs:complexType name="FooListType">
    <xs:sequence>
      <xs:element name ="foo" type="FooType" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>

  <xs:element name="fullaFoo">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="foos" type="FooListType" />
      </xs:sequence>
    </xs:complexType>

  </xs:element>
</xs:schema>

Пример экземпляра FooData.xml--обратите внимание на вложенные заметки

<?xml version="1.0" encoding="utf-8" ?>
<fullaFoo xmlns="http://tempuri.org/FooSchema">
  <foos>
    <foo isBar="false">
      <stuff>first</stuff>
      <nonsense>item</nonsense>
      <note>This is the first note.</note>
    </foo>
    <foo isBar="true">
      <stuff>things</stuff>
      <nonsense>other things</nonsense>
    </foo>
    <foo isBar="false">
      <stuff>yet more information</stuff>
      <nonsense>sound, fury, etc.</nonsense>
    </foo>
    <foo isBar="true">
      <stuff>yes please</stuff>
      <nonsense>no thank you</nonsense>
      <note dateStamp="2012-02-12T00:00:00" isBar="false">RE good manners</note>
    </foo>
    <foo isBar="false">
      <stuff>last</stuff>
      <nonsense>item</nonsense>
    </foo>
  </foos>
</fullaFoo>

элементарное ожидаемое преобразование C #

    void Test_ReadXmlToDataset()
    {
        string pathRoot = @"C:\SomePath\";
        string pathSchema = pathRoot + @"FooSchema.xsd";
        string pathData = pathRoot + @"FooData.xml";

        DataSet dsTest = new DataSet("testXml");
        dsTest.ReadXmlSchema(pathSchema);
        dsTest.ReadXml(pathData);

        //rubber would meet road here...

        DisplayTableStructure(dsTest);
    }
    void DisplayTableStructure(DataSet dataSet)
    {
        Console.WriteLine("\r\nTable structure \r\n");
        Console.WriteLine("Tables count=" + dataSet.Tables.Count.ToString());
        for (int i = 0; i < dataSet.Tables.Count; i++)
        {
            Console.WriteLine("\tTableName='" + dataSet.Tables[i].TableName + "'.");
            Console.WriteLine("\tColumns count=" + dataSet.Tables[i].Columns.Count.ToString());

            for (int j = 0; j < dataSet.Tables[i].Columns.Count; j++)
            {
                Console.WriteLine("\t\tColumnName='" +
                                  dataSet.Tables[i].Columns[j].ColumnName + "', type = "
                                  + dataSet.Tables[i].Columns[j].DataType.ToString());
            }
        }
        Console.ReadLine();
    }
...