Steven
Steven

Reputation: 18869

Add XElement only if value exists

I'm creating an XDocument using Linq-To-XML, like this:

Order order = GetOrder();

XDocument doc = new XDocument(
    new XElement("purchaseOrder",
        new XElement("Name", order.Name),
        new XElement("Address", order.Address),
        new XElement("Shipper", order.Shipper)
    )
);

So sometimes an order will not have a Shipper, it will be null. In that case, I don't want to include the Shipper element at all.

How can I do that inline in my code when creating the doc?

Upvotes: 0

Views: 2196

Answers (3)

FarmerBob
FarmerBob

Reputation: 1364

I would have something like this:

Order order = GetOrder();

XDocument doc = new XDocument(
    new XElement("purchaseOrder",
        new XElement("Name", order.Name),
        new XElement("Address", order.Address),
        OptionalXElement("Shipper", order.Shipper)
    )
);

Sometimes I have a subclass of XElement anyway (to automatically prepend a namespace), and add the static helper to it:

MyXElement.CreateIfNeeded("Shipper", order.Shipper);

Upvotes: 1

EZI
EZI

Reputation: 15364

I would form the xml in parts instead of forming all of it at once. (easier to read, easier to debug)

XDocument doc = new XDocument();

var order = new XElement("purchaseOrder",
                new XElement("Name", order.Name),
                new XElement("Address", order.Address));

if(order.Shipper!=null) order.Add(new XElement("Shipper", order.Shipper));

doc.Add(order);

Upvotes: 3

Jeff Mercado
Jeff Mercado

Reputation: 134521

Just check if the Shipper value is null. If it isn't, then add your element, otherwise just set it to null. A null value in the constructor translates to nothing added in its place.

Order order = GetOrder();

XDocument doc = new XDocument(
    new XElement("purchaseOrder",
        new XElement("Name", order.Name),
        new XElement("Address", order.Address),
        order.Shipper != null ? new XElement("Shipper", order.Shipper) : null
    )
);

Upvotes: 4

Related Questions