4

I have to create an XML file dynamically based on the user input.

Here is what I came up with and I am struck up with two issues.

  1. if there is a collection of same element (MaxOccurs = 10) (For example if the user entered 4 accounts then how should my code be)
  2. If there is a choice option. Based on the element chosen the child elements should change.

Somebody please help me.

Thanks in advance

BB

My 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**           
                )
            )
        )
    );

3 Answers 3

6

LINQ comes in handy for things like this:

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)
              )
          )
      );
Sign up to request clarification or add additional context in comments.

4 Comments

StriplingWarrior thank you very much. Based on (p.Name) selected I have to add a complete different set of elements to "products".
say if p.Name is CLUEAuto then i have to add parameter,pnc,usage Elements to "products". If p.Name is Mortgae then I have to add parameter,RiskAddress,CurrentAddress,PreviousAddress,Mortgage elements to Products
new XElement("parameter),new XElement("pnc"),new XElement("usage", ClueAutoUsageEnum),
@BumbleBee: Apply the same principles you saw me use: ...new XElement(p.Name, from t in thingRepository.GetByProductName(p.Name) select new Element(t.Whatever)
2

Use an XmlWriter object instead, at least imo it is easier to do the sort of things you want. You can then structure it something like:

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

Comments

0

Or create a class for each type that you want to convert to XML and use the 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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.