c # чтение дочерних таблиц DataSet - PullRequest
0 голосов
/ 29 февраля 2012
  <products>
    <product id="1">
          <photos>
            <photo addr="1.jpg" />
          </photos>
          <parameters>
            <parameter name="name" />
          </parameters>
    </product>
  </products>

Здравствуйте, у меня есть этот xml, я хочу получить значения, такие как addr фото или имя параметра, которые я не могу.в DataGrid я получаю как новую таблицу.Как читать эти параметры по идентификатору продукта?

        foreach (DataTable t in dataSet.Tables)
        {
            Console.WriteLine(t);
        }

Я получаю: продукт, фотографии, фото, параметры, параметр.

Извините за мой английский

Ответы [ 2 ]

0 голосов
/ 01 марта 2012

ОК, вам нужно использовать вывод схемы для создания файла XSD, а затем запустить xsd.exe, чтобы сгенерировать необходимый набор данных.

Начнем с того, что предоставленный вами XML не сработает, потому что у вас нет корневого узла. Я делаю здесь дикую догадку, но если <products> является корневым узлом, мы можем переформатировать ваш XML, чтобы он выглядел так:

<products>
  <product id="1">
    <photos>
      <photo addr="1.jpg" />
    </photos>
    <parameters>
      <parameter name="name1" />
    </parameters>
  </product>
  <product id="2">
    <photos>
      <photo addr="2.jpg" />
    </photos>
    <parameters>
      <parameter name="name2" />
    </parameters>
  </product>
</products>

Затем мы можем взять этот XML и вывести из него XSD через класс XmlSchemaInference. Когда я вывел схему из приведенного выше XML, я получил это:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="products">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="product">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="photos">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="photo">
                      <xs:complexType>
                        <xs:attribute name="addr" type="xs:string" use="required" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="parameters">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="parameter">
                      <xs:complexType>
                        <xs:attribute name="name" type="xs:string" use="required" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="id" type="xs:unsignedByte" use="required" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Затем я запустил xsd.exe с параметром / dataset, который дал мне полностью функциональный DataSet, представляющий исходный XML. Заполнение набора данных и использование DataSet.GetXml() возвращает ожидаемый результат XML.

Последнее замечание: я не защищаю использование DataSets над объектами домена и т. Д. И т. Д. Я просто хотел показать вам, каковы будут шаги для достижения вашей заявленной цели.

0 голосов
/ 29 февраля 2012

По умолчанию DataSet предполагает схему, основанную на элементах, а не атрибутах. Вам нужно создать xsd для ваших данных, чтобы DataSet правильно прочитал этот XML.

Из-за того, как сконструирован этот XML, нет простого способа записать это в DataSet напрямую. Вам нужно будет использовать xsd.exe для создания файла xsd, а затем отредактировать его вручную с соответствующими атрибутами из пространства имен msdata. Это довольно болезненный процесс.

Вы можете преобразовать документ в форму, которая, вероятно, будет правильно анализироваться в DataSet, либо переписав XML с использованием LINQ, либо применив XslCompiledTransform :

<products>
     <product id="1">
         <photo addr="1.jpg" />
         <parameter name="name" />
     </product>
</products>

Вы также можете использовать LINQ to XML вместо того, чтобы пытаться использовать DataSet:

var productsInfo = from product in productsElement.Descendants("product")
                   from photo in product.Descendants("photo")
                   from parameter in product.Descendants("parameter")
                   let id = product.Attribute("id")
                   let addr = photo.Attribute("addr")
                   let name = parameter.Attribute("name")
                   select new { ID = id.Value, Addr = addr.Value, Name = name.Value};

Если вы разрабатываете новый макет XML, а не работаете с существующим, вы можете сначала создать DataSet с помощью конструктора. Заполните его фиктивными данными, затем вы можете использовать WriteXml , чтобы получить схему xsd и пример данных. Чтобы сохранить Relationshps в выходном XML-файле, обязательно задайте для свойства Nested ваших отношений значение true (см. Вложенность DataRelations (ADO.NET) ).

...