2010-11-16 8 views
4

Je dois créer un fichier XML dynamiquement en fonction de l'entrée de l'utilisateur.Création dynamique XML à l'aide de C#

Voici ce que j'ai trouvé et je suis confronté à deux problèmes.

  1. s'il y a une collection de même élément (maxOccurs = 10) (Par exemple, si l'utilisateur est entré 4 comptes alors comment devrait être mon code)
  2. S'il y a une option de choix. En fonction de l'élément choisi, les éléments enfants doivent changer.

Quelqu'un s'il vous plaît aidez-moi.

Merci à l'avance

BB

Mon code:

XElement req = 
    new XElement("order", 
     new XElement("client", 
      new XAttribute("id", clientId), 
      new XElement("quoteback", 
       new XAttribute ("name",quotebackname) 
       ) 
      ), 
     new XElement("accounting", 
      new XElement("account"), 
      new XElement("special_billing_id") 
      ), 
     new XElement("products", 
      new XElement(
       **productChoiceType**, 
       ***** HERE THE ELEMENTS WILL CHAGE BASED ON **productChoiceType**   
       ) 
      ) 
     ) 
    ); 

Répondre

6

LINQ est très pratique pour des choses comme ceci:

XElement req = 
    new XElement("order", 
     new XElement("client", 
      new XAttribute("id",clientId), 
      new XElement("quoteback", new XAttribute ("name",quotebackname)) 
      ), 
     new XElement("accounting", 
      new XElement("account"), 
      new XElement("special_billing_id") 
      ), 
      new XElement("products", 
       new XElement(productChoices.Single(pc => pc.ChoiceType == choiceType).Name, 
        from p in products 
        where p.ChoiceType == choiceType 
        select new XElement(p.Name) 
      ) 
     ) 
    ); 
+0

StriplingWarrior merci beaucoup. Basé sur (p.Nom) sélectionné, je dois ajouter un ensemble complet différent d'éléments à "produits". – BumbleBee

+0

disons si p.Name est CLUEAuto alors je dois ajouter le paramètre, pnc, utilisation des éléments à "produits". Si p.Name est Mortgae alors je dois ajouter le paramètre, RiskAddress, CurrentAddress, PreviousAddress, éléments d'hypothèque aux produits – BumbleBee

+0

nouveau XElement ("paramètre), nouveau XElement (" pnc "), nouveau XElement (" usage ", ClueAutoUsageEnum), – BumbleBee

1

Utilisez un objet au lieu XmlWriter, au moins imo il est plus facile de faire le genre de choses que vous voulez. Vous pouvez structurer ensuite quelque chose comme:

XmlWriter w = XmlWriter.Create(outputStream); 
w.WriteStartElement("order"); 

w.WriteStartElement("client"); 
w.WriteAttributeString("id", clientId); 

// ... 
w.WriteElementString("product", "1"); 
w.WriteElementString("product", "2"); 
w.WriteElementString("product", "3"); 
w.WriteElementString("product", "4"); 

// etc.... 

w.WriteEndElement(); // client 

w.WriterEndElement(); // order 
0

Ou créer une classe pour chaque type que vous souhaitez convertir en XML et utiliser le XmlSerializer.

<XmlElement("order")> _ 
Public Class Order 
    <XmlElement("accounting")> _ 
    Dim accounts As List(Of Account) 
    ... 
End Class 

Dim xmlSer as New XmlSerialzer(GetType(Accounting)) 
xmlSer.Serialize(myXmlWriter, myObjInstance)