2010-09-08 4 views
1

Normalement, j'écris une classe et y ajoute la sérialisation XML pour mes services Web.C# Comment remplir la classe créée à l'aide de XSD.EXE à partir de la base de données

[XmlRootAttribute(ElementName = "dsXmlSummary", IsNullable=true)] 
public class Class1 
{ 
    //declare properties 
    //make database calls to pull data and load properties 
} 

Je travaille sur un projet qui me demande d'utiliser un XSD strict, j'ai suivi les instructions sur l'utilisation de l'outil XSD.exe pour créer une classe basée sur la XSD. Mon interprétation était que cette classe générée automatiquement remplacerait ma classe sérialisée normale.

Si tel est le cas, je perds complètement le chargement des données dans les propriétés de la classe. J'ai rassemblé depuis un autre promenade à travers:

[WebMethod] 
public dsXmlSummary getXML() 
{ 
    TextReader reader = new StreamReader("data.xml"); 
    dsXmlSummary ds = (dsXmlSummary)serializer.Deserialize(reader); 
    reader.Close(); 
} 

Cependant les données que je l'ai est situé dans une base de données SQL ... je me suis dit que je devrais être en mesure d'écrire une méthode pour remplir la classe dsXmlSummary, mais je Je ne trouve aucune documentation sur cela. Tous les exemples sont comme ci-dessus, en chargeant ou en lisant à partir d'un document xml physique réel.

J'ai essayé de tester une charge manuelle:

[WebMethod] 
    public dsXmlSummary getXML() 
    { 
     dsXmlSummary xml = new dsXmlSummary(); 
     xml.Items[0].nameFirst = "Mark"; //error thrown here: System.NullReferenceException: Object reference not set to an instance of an object. 
     xml.Items[0].nameLast = "Twain"; 
     xml.Items[0].Type = "Writer"; 

     return xml; 
    } 

Il est évident que je vais sur ce tout faux. Toute orientation est grandement appréciée.

EDIT

Mon WebMethod

 [WebMethod] 
    public dsXmlSummary getXML() 
    { 
     dsXmlSummary xml = new dsXmlSummary(); 
     dsXmlSummaryAdmin_reports_xmlReports[] items = new dsXmlSummaryAdmin_reports_xmlReports[1]; 
     items[0].nameFirst = "Mark"; //error still thrown here: System.NullReferenceException: Object reference not set to an instance of an object. 
     items[0].nameLast = "Twain"; 
     items[0].Type = "Writer"; 

     xml.Items = items; 
     return xml; 
    } 

La classe générée Auto

public partial class dsXmlSummary { 

private dsXmlSummaryAdmin_reports_xmlReports[] itemsField; 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute("admin_reports_xmlReports")] 
public dsXmlSummaryAdmin_reports_xmlReports[] Items { 
    get { 
     return this.itemsField; 
    } 
    set { 
     this.itemsField = value; 
    } 
    } 
} 

Répondre

3

Si vous obtenez votre XML de la base de données sous la forme d'une chaîne, vous pouvez utiliser un StringReader. Ou si vous obtenez un byte[] vous pouvez essayer un MemoryStream. En ce qui concerne votre exemple "manuel", vous devez initialiser votre tableau Items.
<modifier> Ajouté xml.Items[0] = new YourItemsType(); </modifier >

[WebMethod] 
public dsXmlSummary getXML() 
{ 
    dsXmlSummary xml = new dsXmlSummary(); 
    xml.Items = new YourItemsType[1]; // <-- initialize here 
    xml.Items[0] = new YourItemsType(); // <-- initialize first object 
    xml.Items[0].nameFirst = "Mark"; //error thrown here: System.NullReferenceException: Object reference not set to an instance of an object. 
    xml.Items[0].nameLast = "Twain"; 
    xml.Items[0].Type = "Writer"; 

    return xml; 
} 
+0

Je suppose que c'est mon problème. Je sais comment passer du flux à la sérialisation ... Cependant, les données ne sont pas structurées en XML dans la base de données. J'ai écrit une classe qui extrait les données de la base de données, puis rend la classe elle-même sérialisable en définissant les propriétés xml ... je ne suis pas sûr de savoir comment obtenir cela d'une classe à un flux. – jon3laze

+0

@ jon3laze: Oups, j'ai oublié d'initialiser le premier élément, corrigé mon exemple, réessayez. –

0

Pour autant que je me rappelle, vous pouvez obtenir le XML Dataset/Datatable (ToString()? ou peut être WriteXML), pas sûr (e)), puis utiliser

+0

Désolé, mon explication de la question était claire. Je l'ai édité, j'espère que cela a un peu plus de sens maintenant. Merci pour votre réponse. – jon3laze

+0

Aha .. désolé, j'ai un peu écrémé votre question .. de toute façon, je suppose que la réponse d'Albin est suffisante maintenant –

Questions connexes