Search code examples
c#xmlxelement

Do not add XElement if value is 0


I am creating an XML (see function below):

public static string CreteInvoice()
        {
            string _dc;

            Mark pm = new Mark();
            XNamespace tu = "http://www.name.com";

            var item = QueryDb.InvoiceHeader;
            var TaxNr = QueryDb.MyCertificates.FirstOrDefault();
            _dc = TaxNr.CertificateTaxNumber;

            XElement root = new XElement(tu + "InvoiceRequest",
                                new XAttribute(XNamespace.Xmlns + "tu", "http://www.test.com/"),
                                new XAttribute("Id", "data"),
                                new XElement(tu + "Header",
                                    new XElement(tu + "MessageID", item.XMLMessageID),
                                    new XElement(tu + "DateTime", item.DateSentToFurs.ToString("yyyy-MM-ddTHH:mm:ss"))),
                                    new XElement(tu + "Invoice",
                                        new XElement(tu + "TaxNumber", _dc),
                                        new XElement(tu + "IssueDateTime", item.DateOfInvoiceCreation.ToString("yyyy-MM-ddTHH:mm:ss")),
                                        new XElement(tu + "NumberingStructure", item.NumberingStructure),
                                        new XElement(tu + "InvoiceIdentifier",
                                            new XElement(tu + "BusinessPremiseID", item.BussinesspremiseID),
                                            new XElement(tu + "ElectronicDeviceID", item.ElectronicDeviceID),
                                            new XElement(tu + "InvoiceNumber", item.InvoiceNumber) 
                                        //  ,new XElement(tu + "TaxNrSeller", item.TaxNrSeller) <- problem when item.TaxNrSeller is 0 or empty
                                        )
                                    ));

            XDocument xdoc = new XDocument(new XDeclaration("1.0", "UTF-8", ""));
            xdoc.Add(root);

            string xdocText = xdoc.Declaration.ToString().Remove(36, 14) + "\n" + xdoc.ToString();

            return xdocText;
        }

In code (above) i have marked where i should create an XElement only: if item.TaxNrSeller is different than 0. If item.TaxNrSeller is 0 tag TaxNrSeller should not be applied.

If you need any more info please let me know!


Solution

  • Turns out, if you pass a null element, its skipped. So you should be fine with:

    new XElement(tu + "InvoiceIdentifier",
        new XElement(tu + "BusinessPremiseID", item.BussinesspremiseID),
        new XElement(tu + "ElectronicDeviceID", item.ElectronicDeviceID),
        new XElement(tu + "InvoiceNumber", item.InvoiceNumber),
        item.TaxNrSeller != 0 ? new XElement(tu + "TaxNrSeller", item.TaxNrSeller) : null
    );
    

    If content is null, nothing is added. When passing a collection items in the collection can be null. A null item in the collection has no effect on the tree.

    Source: https://msdn.microsoft.com/en-us/library/bb943882(v=vs.110).aspx

    Other than that, you can just construct objects manually (which is easier to debug). This way you can provide a 0 check yourself.