2010-07-14 5 views
4

Je veux lire des données XML dans un DataTable - en utilisant la méthode ReadXml comme siComment lire XML dans un DataTable lorsque le XML est dans un espace de nom particulier

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

Voir ci-dessous pour la chaîne XML. Le XML inclut la définition du schéma et tout va bien quand les données n'ont pas d'espace de noms (c'est-à-dire dans l'espace de noms global) mais je ne peux pas spécifier comment le schéma et le XML sont tels.

L'exception que je reçois est "DataTable 'cd: Motos' ne correspond à aucun DataTable dans la source."

Je sais que je fais une erreur d'écolier vraiment stupide, mais je me suis arraché les cheveux maintenant pour une heure ou deux - du bidouillage sans succès. Est-ce que quelqu'un peut me mettre hors de ma misère?

XML qui fonctionne

  <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 avec espace de noms (ne fonctionne pas)

  <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> 

Répondre

10

Vous devez prendre deux choses en compte lors de la lecture de ce XML:

  • l'espace de noms XML urn:ChartData
  • le nom de la principale table de données dans l'ensemble de données - vous trouvez cela ici:

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

Avec ces deux choses à l'esprit, vous devez changer la façon dont vous instancier les DataTable et puis la lecture fonctionne très bien:

// 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); 

maintenant, votre dataTable devrait contenir quelques entrées dans sa propriété .Rows - cinq dans mon cas (avec votre seco nd exemple XML).

+1

Merci Marc. En l'occurrence, je ne peux pas changer le code qui instancie le DataTable (histoire longue) - mais au moins je peux maintenant arrêter avec mon approche d'essai-et-erreur pour le faire fonctionner en manipulant le schéma XML +. –

Questions connexes