2011-09-17 4 views
2

J'ai un struct comme ceci:sérialisation Xml - Modifier le type de sérialisation de xml

public struct Vehicles 
{ 
    public string Name { get; set; } 
    public string Count { get; set; } 
    public List<Car> Cars { get; set; } 
} 

public struct Car 
{ 
    public string Name { get; set; } 
    public int Count { get; set; } 
    public List<Tire> Tires { get; set; } 
} 

public struct Tire 
{ 
    public string Brand { get; set; } 
    public int Count { get; set; } 
    public int UniqueCount { get; set; } 
    public List<Dimension> Dimensions { get; set; } 
} 

public struct Dimension 
{ 
    public string Size { get; set; } 
    public int AlternateSize { get; set; } 
} 

Quand je sérialiser "Véhicules", il est comme:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org /2001/XMLSchema"> 
    <Vehicles> 
    <Name>SuperVehicles</Name> 
    <Cars> 
     <Car> 
     <Name>BMW</Name> 
     <Count>29</Count> 
     <Tires> 
      <Tire> 
      <Name>DMZ</Name> 
      <Count>26</Count> 
      <UniqueCount>24</UniqueCount> 
      <Dimensions> 
       <Dimension> 
       <Size>70x570</Size> 
       <AlternateSize>70x580</AlternateSize> 
       </Dimension> 
       <Dimension> 
       <Size>60x570</Size> 
       <AlternateSize>60x580</AlternateSize> 
       </Dimension> 
       <Dimension> 
       <Size>50x570</Size> 
       <AlternateSize>50x580</AlternateSize> 
       </Dimension> 
      </Dimensions> 
      </Tire> 
     </Tires> 
     </Car> 
    </Cars> 
    </Vehicles> 
</root> 

Maintenant, le problème est, je veux sérialiser comme ceci:

<root> 
    <vehicles vehicleName="superVehicles" vehicleCount="50" carName="BMW" 
     carCount="25" tireBrand="kamu" tireCount="15" tireUniqueCount="15" 
     dimensionSize="70x570" dimensionAlternateSize="70x580" /> 
    <vehicles vehicleName="superVehicles" vehicleCount="35" carName="MERCEDES" 
     carCount="22" tireBrand="kamu" tireCount="12" tireUniqueCount="12" 
     dimensionSize="60x570" dimensionAlternateSize="60x580" /> 
    <vehicles vehicleName="superVehicles" vehicleCount="35" carName="PORSCHE" 
     carCount="22" tireBrand="kamu" tireCount="12" tireUniqueCount="12" 
     dimensionSize="60x570" dimensionAlternateSize="60x580" /> 
</root> 

dois-je changer la structure et éviter les regroupements ou est-il un moyen de creat e un schéma pour la sérialisation xml pour rassembler ce résultat.

Résumé: Je récupère tous les éléments enfants dans une nouvelle balise quand je sérialise la structure racine en xml mais je dois les prendre comme les propriétés d'une instance qui ne crée que le nombre de racines (Véhicules dans cette situation) des lignes en xml.

+0

Désolé de ne pas savoir que vous l'avez édité. N'hésitez pas à revenir en arrière si je l'ai foutu :) –

+0

@Merlyn Nope! Je l'ai vissé. Impossible de corriger pour afficher le bloc de code xml à droite. S'il vous plaît aidez-moi et il serait bon de me dire comment faire cela (: –

+0

J'ai eu le XML montrant dans mon edit ... –

Répondre

1

Vous devez effectuer une sérialisation manuelle.

Voici comment vous pouvez implémenter cela en utilisant System.Xml.Linq:

var xmlElementsVehicles = new[]{ 
            new XElement("vehicles ", new object[] 
            { 
            new XElement("vehicleName", "superVehicles"), 
            new XElement("vehicleCount", 35), 
            new XElement("carName", "PORSCHE"), 
            new XElement("carCount", 2) 
            }), 
            new XElement("vehicles ", new object[] 
            { 
            new XElement("vehicleName", "superVehicles"), 
            new XElement("vehicleCount", 35), 
            new XElement("carName", "PORSCHE"), 
            new XElement("carCount", 2) 
            }) 
           }; 
var root = new XElement("root", xmlElementsVehicles); 
var myXml = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), root); 
using (var xmlWriter = XmlWriter.Create(stream)) 
{ 
    myXml.Save(xmlWriter); 
} 
+0

oh, merci pour cela.Je suppose qu'il n'y a aucune auto-config pour cela, comme je pourrais définir un schéma et il utilise cela, non? –

+0

@Beytan: Non , il n'y a rien d'automatique à ce sujet Il y a [une interface que vous pouvez implémenter sur votre (vos) type (s) de données] (http://msdn.microsoft.com/fr-fr/library/system.xml.serialization.ixmlserializable.aspx) Dites au sérialiseur Xml d'utiliser cette implémentation, cependant –

1

Pour utiliser XmlSerializer le modèle doit à peu près être la même que la mise en page; quelques choses peuvent changer (noms, etc). Cependant, votre modèle est rien comme le XML. Trois options, puis:

  • créer un second modèle DTO qui ressemble à XML (vous pouvez utiliser xsd.exe sur le XML exemple pour automatiser cela), et utiliser XmlSerializer
  • n'utilisent pas XmlSerializer, mais construire le XML en quelque sorte d'autre (XmlDocument ou XDocument serait deux évidente, ou XmlWriter si la taille est très grande)
  • utiliser quelque chose comme xslt pour remodeler le XML après avoir écrit

Il n'y a rien « facile » peut faites-le pour que XmlSerializer écrive ce modèle dans votre XML désiré.

+0

ess xslt est la bonne réponse à cette question, mais il serait bon de donner un exemple pour être bref. –

+0

@Beytan dont? il y a 3 options, tout beaucoup de travail ... –

+0

au xslt un. Le premier n'est pas facile pour moi. le second est un petit manuel je suppose, pas sûr cependant. le 3ème est un peu automatisé je suppose, je l'ai compris comme: créer ce xml et fournir un xslt pour le manipuler, non? –