Search code examples
c#xmllinq-to-xmlxelement

How do I not print a node when it is null


I have written the following code. But I am not able to understand how to not to print the empty node if the List() Value is null. How do I go about it?

 private TokenValues TokenValues(string emailData)
 {

   if (!string.IsNullOrWhiteSpace(emailData))
   {

    XDocument xmldoc = XDocument.Parse(chkData);

    var nodes = xmldoc.Descendants().Elements();
    if (nodes == null || nodes.Count() == 0) return new TokenValues();
      TokenValues tokenvalues = new TokenValues { Tokens = new List<Model2.Token>() };
      foreach (XElement node in nodes)
      {
         Model2.Token token = new Model2.Token { Name = node.Name.ToString(), 
                                                 Value = node.Value, 
                                                 Tokens = new List<Model2.Token>() 
                                               };

         var descendants = node.Descendants();
         if (descendants != null && descendants.Count() > 0)
         {
             foreach (XElement dnode in descendants)
                  token.Tokens.Add(new Model2.Token { Name = dnode.Name.ToString()
                                                    , Value = dnode.Value
                                                    , Tokens = new List<Model2.Token>()                               
                                                    }
                     );

         }
          tokenvalues.Tokens.Add(token);
      }
      return tokenvalues;

My output file looks something like this:

  <Tokens>
    <Token>
       <Name>first_name</Name>
       <Tokens/>
       <Value>Antoinette</Value>
    </Token>
    <Token>
       <Name>last_name</Name>
       <Tokens/>
       <Value>MCGRATH</Value>
    </Token>
    <Token>
        <name>Employee_Details</name>
          <Tokens>
            <Token>
              <name>Address</name>
              <Tokens/>
              <value>123 xyz</value>
            </Token>
            <Token>
               <name>City</name>
               <Tokens/> 
               <value>Las Vegas</value>
            </Token>
         </Tokens>
       <Value>
          123 xyz Las Vegas
       </Value>
    </Token>
 </Token>

I do not want the to print if it is null.


Solution

  • How about preprocessing the XML document to remove empty nodes before executing further logic :

    XDocument xmldoc = XDocument.Parse(chkData);
    var emptyNodes = xmldoc.Descendants().Where(o => o.IsEmpty).ToList();
    foreach (XElement n in emptyNodes)
    {
        n.Remove();
    }
    //here you can continue with your logic to generate TokenValues
    .....
    .....