2016-03-18 4 views
0

Я создаю XML (см функцию ниже):Не добавляйте XElement, если значение равно 0

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; 
     } 

В коде (выше) я пометил, где я должен создавать XElement только: если item.TaxNrSeller отличается чем 0. Если item.TaxNrSeller is 0 тег TaxNrSeller не должен применяться.

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать!

ответ

1

Оказывается, если вы передаете нулевой элемент, его пропускают. Таким образом, вы должны быть хорошо с:

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

Если содержание нулевой, не добавляют ничего. При передаче предметов коллекции в коллекции может быть null. A null Элемент коллекции не влияет на дерево.

Источник: https://msdn.microsoft.com/en-us/library/bb943882(v=vs.110).aspx

Кроме этого, вы можете просто создавать объекты вручную (что легче отлаживать). Таким образом, вы можете предоставить вам 0.

1

Попробуйте так:

new XElement(tu + "InvoiceNumber", item.InvoiceNumber), 
item.TaxNrSeller != null && item.TaxNrSeller != 0 ? new XElement(tu + "TaxNrSeller", item.TaxNrSeller) : null 
1

Создать новый метод, который refactors ваш немного, чтобы создать узел XElement код:

public static XElement CreateNode(XNamespace nameSpace, string nodeName, object value) 
{ 
    return new XElement(nameSpace + nodeName, value); 
} 

Тогда в вашем методе вы можете использовать его:

XElement root = new XElement(tu + "InvoiceRequest", 
        new XAttribute(XNamespace.Xmlns + "tu", "http://www.test.com/"), 
        new XAttribute("Id", "data"), 
        new XElement(tu + "Header" 
         )); 
root.Add(CreateNode(tu, "MessageID", item.XMLMessageID)); 
// etc... 
if (item.TaxNrSeller != 0 || item.TaxNrSeller != null) 
    root.Add(CreateNode(tu, "TaxNrSeller", item.TaxNrSeller)); 
Смежные вопросы