Как читать XML в DataTable, когда XML находится в определенном пространстве имен - PullRequest
4 голосов
/ 14 июля 2010

Я хочу прочитать некоторые данные XML в DataTable - используя метод ReadXml, например,

        var dataTable = new DataTable();
        XmlReader xmlReader = XmlReader.Create(new StringReader(xmlString));
        dataTable.ReadXml(xmlReader);

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

Исключение, которое я получаю: «DataTable« cd: Motorcycles »не соответствует ни одной DataTable в источнике».

Я знаю, что делаю какую-то действительно глупую ошибку для школьника, но я вырывал свои волосы в течение часа или около того - возился без успеха.

Может ли кто-нибудь избавить меня от страданий?

XML, который работает

          <NewDataSet xmlns="">
            <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
              <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Motorcycles" msdata:UseCurrentLocale="true">
                <xs:complexType>
                  <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element name="Motorcycles">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="Manufacturer" type="xs:string" minOccurs="0" />
                          <xs:element name="PercentageOfRiders" type="xs:int" minOccurs="0" />
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:choice>
                </xs:complexType>
              </xs:element>
            </xs:schema>
            <Motorcycles>
              <Manufacturer>Honda</Manufacturer>
              <PercentageOfRiders>23</PercentageOfRiders>
            </Motorcycles>
            <Motorcycles>
              <Manufacturer>Yamaha</Manufacturer>
              <PercentageOfRiders>15</PercentageOfRiders>
            </Motorcycles>
            <Motorcycles>
              <Manufacturer>Suzuki</Manufacturer>
              <PercentageOfRiders>16</PercentageOfRiders>
            </Motorcycles>
            <Motorcycles>
              <Manufacturer>BMW</Manufacturer>
              <PercentageOfRiders>6</PercentageOfRiders>
            </Motorcycles>
            <Motorcycles>
              <Manufacturer>Other</Manufacturer>
              <PercentageOfRiders>40</PercentageOfRiders>
            </Motorcycles>
          </NewDataSet>

XML с пространством имен (не работает)

          <cd:NewDataSet xmlns="urn:ChartData" xmlns:cd="urn:ChartData">
            <xs:schema id="NewDataSet" 
                       targetNamespace="urn:ChartData" 
                       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                       xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
                       elementFormDefault="qualified">
              <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="cd:Motorcycles" msdata:UseCurrentLocale="true">
                <xs:complexType>
                  <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element name="Motorcycles">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="Manufacturer" type="xs:string" minOccurs="0" />
                          <xs:element name="PercentageOfRiders" type="xs:int" minOccurs="0" />
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:choice>
                </xs:complexType>
              </xs:element>
            </xs:schema>
            <cd:Motorcycles>
              <cd:Manufacturer>Honda</cd:Manufacturer>
              <cd:PercentageOfRiders>23</cd:PercentageOfRiders>
            </cd:Motorcycles>
            <cd:Motorcycles>
              <cd:Manufacturer>Yamaha</cd:Manufacturer>
              <cd:PercentageOfRiders>15</cd:PercentageOfRiders>
            </cd:Motorcycles>
            <cd:Motorcycles>
              <cd:Manufacturer>Suzuki</cd:Manufacturer>
              <cd:PercentageOfRiders>16</cd:PercentageOfRiders>
            </cd:Motorcycles>
            <cd:Motorcycles>
              <cd:Manufacturer>BMW</cd:Manufacturer>
              <cd:PercentageOfRiders>6</cd:PercentageOfRiders>
            </cd:Motorcycles>
            <cd:Motorcycles>
              <cd:Manufacturer>Other</cd:Manufacturer>
              <cd:PercentageOfRiders>40</cd:PercentageOfRiders>
            </cd:Motorcycles>
          </cd:NewDataSet>

1 Ответ

10 голосов
/ 14 июля 2010

При чтении этого XML необходимо учитывать две вещи:

  • пространство имен XML urn:ChartData
  • имя основной таблицы данных внутри набора данных - вы найдете это здесь:

    <xs:element name="NewDataSet" msdata:IsDataSet="true" 
                msdata:MainDataTable="cd:Motorcycles"  <== this name here is important
                msdata:UseCurrentLocale="true">
    

Имея в виду эти две вещи, вам нужно изменить способ создания экземпляра DataTable, и тогда чтение будет работать нормально:

// define the data table's name to be the value of the msdata:MainDataTable 
// attribute on the NewDataSet element, and define the XML namespace to use
DataTable dataTable = new DataTable("Motorcycles", "urn:ChartData");

XmlReader xmlReader = XmlReader.Create(new StringReader(xmlString));
dataTable.ReadXml(xmlReader);

Теперь ваш dataTable должен содержать несколько записей в свойстве .Rows - пять в моем случае (с вашим вторым примером XML).

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