2009-12-22 3 views
3

Hope I a choisi le bon forum.XML Control sérialisation de DataSet - Attributs sur "élément TableName"

J'ai un objet ensemble de données avec une table qui me vient de la méthode GetDS d'un composant personnalisé commun. J'ai besoin de passer le XML à un autre processus (segmenté comme tableau d'octets). Je l'ai tout fonctionne mais le XML manque certains attributs que le processus de consommation attend.

créer un objet ensemble de données et peut contrôler le nom du TableName (élément racine) et la ligne comme ceci:

da.Fill(ds, "Foo") 
ds.DataSetName = "FooUpload" 

J'utilise la méthode GetXML de sérialisation XML qui ressemble à ce qui suit:

<?xml version="1.0" standalone="yes" ?> 
<FooUpload> 
    <Foo> 
    <FooMasterID>483</FooMasterID> 
    <Country>27</Country> 
    <PaymentCode>ANN</PaymentCode> 
    <Amount>132</Amount> 
    <PaidDate>2012-12-31 00:00:00</PaidDate> 
    <PaidBy>FooServices</PaidBy> 
    </Foo> 
</FooUpload> 

le processus appelant attend

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<FooUpload **ClientCode="FOOO" RecordCount="1" CreateDate="2008-12-09T15:02:18.920" CreateUser="valli"**> 
    <Foo> 
    <FooMasterID>483</FooMasterID> 
    <Country>27</Country> 
    <PaymentCode>ANN</PaymentCode> 
    <Amount>132</Amount> 
    <PaidDate>2012-12-31 00:00:00</PaidDate> 
    <PaidBy>FooServices</PaidBy> 
    </Foo> 
</FooUpload> 

Notez les attributs de la FooUpload élément. Ce noeud est le nom du DataTable dans le DataSet.

J'ai cherché comment contrôler le XMLSerializer et trouver beaucoup d'exemples pour des objets personnalisés. J'ai même trouvé des exemples de définition du mappage de colonne à MappingType.Attribute qui est proche, mais je dois le faire avec l'élément racine qui est en fait le TableName de l'ensemble de données.

Je sens que je suis proche et si je ne trouve pas une solution plus élégante que je vais devoir créer un hack comme boucle et crachant chaîne modifiée ainsi que reste du XML.

Merci à l'avance (doigts croisés)!

Répondre

0

Vous pouvez envoyer la sortie de GetXML dans un XmlDocument et ajouter les attributs par la suite. Par exemple:

XmlDocument xdoc = new XmlDocument(); 
xdoc.LoadXml(ds.GetXml()); 
XmlAttribute attr=xdoc.CreateAttribute("ClientCode"); 
attr.Value = "FOOOO"; 
xdoc.DocumentElement.Attributes.Append(attr); 

Vous pouvez alors enregistrer le xdoc dans un fichier, ou le mettre dans une chaîne, par exemple:

XmlTextWriter xw = new XmlTextWriter(new MemoryStream(),Encoding.UTF8); 
xdoc.Save(xw); 
xw.BaseStream.Position = 0; 
StreamReader sr = new StreamReader(xw.BaseStream); 
string result = sr.ReadToEnd(); 
+0

Je pense que cela peut en effet être la seule façon. J'ai trouvé quelques indications que c'est "par conception" que la sérialisation DataSet ne gère pas les types mixtes. – sdmcnitt

+0

@sdmcnitt: alors s'il vous plaît votez ma réponse. Et si vous pensez que vous l'utiliserez, acceptez-le. –

+0

J'ai besoin d'une "15 réputation" pour voter. Je suppose que je suis infâme. – sdmcnitt

0

This semble à peu près que ce que vous recherchez.

+0

Merci uli78. Il semble que ExtendedProperties serait sérialisé en attributs, mais il semblerait que ce ne serait applicable qu'aux colonnes de la table - pas à la table elle-même. Notez les attributs de l'élément FooUpload. Ce noeud est le nom du DataTable dans le DataSet. Il semble que lorsque le DataSet se sérialise, l'élément racine est le nom de la table. Existe-t-il des attributs pour la table dans le DataSet? – sdmcnitt

+0

Oui, il y a. " .ExtendedProperties" – uli78

Questions connexes