Search code examples
c#xmllinq-to-xml

c# Don't as new XElement when element before is null


I'm trying to generate XML from code :

   //// Group the rows by Department (all 123A in your question).
            var departments = dt.AsEnumerable().GroupBy(r => r.Field<string>("ID"));

            // Generate the root element
            var root = new XElement("Catalog",
                departments.Select(
                    d =>
                    new XElement("Product",
                        new XElement("Id", d.Key),
                        d.Select(r => new XElement("LastMod", r.Field<string>("Update_date"))),
                        d.Select(r => new XElement("StructuredId", r.Field<string>("EAN"))),
                        new XElement("Descriptions",
                            d.Select(r => new XElement("Name", r.Field<string>("Name"))),
                            d.Select(r => new XElement("Description", r.Field<string>("Description")))
                            ),
                        new XElement("Prices",
                            d.Select(r => new XElement("Currency", "EUR")),
                            d.Select(r => new XElement("Price", r.Field<double>("Price_netto_EUR")))
                            ),
                        new XElement("Warranty",
                            d.Select(r => new XElement("Type", "Year")),
                            d.Select(r => new XElement("Duration", r.Field<string>("Guarantee").Replace(" years", "")))
                            ),
                             new XElement("Categories",
                             new XElement("Category",
                             d.Select(r => new XElement("Name", r.Field<string>("Category")))
                            )),
                             new XElement("Photos",
                             new XElement("Photo", 
                             d.Select(r => new XElement("Url", r.Field<string>("ImageURL1"))),
                             new XElement("IsPrimary", "true") 
                             ),
                             new XElement("Photo", 
                             d.Select(r => new XElement("Url", r.Field<string>("ImageURL2"))),
                             new XElement("IsPrimary", "false")
                             ),
                                new XElement("Photo",
                             d.Select(r => new XElement("Url", r.Field<string>("ImageURL3"))),
                             d.Select(r => new XElement("IsPrimary", "false"))
                             ),
                             new XElement("Photo",
                             d.Select(r => new XElement("Url", r.Field<string>("ImageURL4"))),
                             d.Select(r => new XElement("IsPrimary", "false"))
                             ),
                               new XElement("Photo",
                             d.Select(r => new XElement("Url", r.Field<string>("ImageURL5"))),
                             d.Select(r => new XElement("IsPrimary", "false"))
                             ),
                             new XElement("Photo",
                             d.Select(r => new XElement("Url", r.Field<string>("FileURL1"))),
                             d.Select(r => new XElement("IsPrimary", "false"))
                             ),
                             new XElement("Photo",
                             d.Select(r => new XElement("Url", r.Field<string>("FileURL2"))),
                             d.Select(r => new XElement("IsPrimary", "false"))
                             ),
                             new XElement("Photo",
                             d.Select(r => new XElement("Url", r.Field<string>("FileURL3"))),
                             d.Select(r => new XElement("IsPrimary", "false"))
                             ),
                             new XElement("Photo",
                             d.Select(r => new XElement("Url", r.Field<string>("FileURL4"))),
                             d.Select(r => new XElement("IsPrimary", "false"))
                             ),
                             new XElement("Photo",
                             d.Select(r => new XElement("Url", r.Field<string>("FileURL5"))),
                             d.Select(r => new XElement("IsPrimary", "false"))
                             )
                             ),
                             new XElement("Availability",
                             d.Select(r => new XElement("Available", r.Field<string>("Available"))),
                             d.Select(r => new XElement("Quantity", r.Field<string>("STOCK"))),
                             d.Select(r => new XElement("ShippingDelay", r.Field<string>("LEADTIME_DAYS")))
                            ),
                             new XElement("Attributes",
                                 new XElement("Attribute", 
                                 d.Select(r => new XElement("AttributeName", "Style")),
                                 d.Select(r => new XElement("AttributeValue", r.Field<string>("Style")))
                                 ),
                                 new XElement("Attribute",
                                 d.Select(r => new XElement("AttributeName", "PrimaryColor")),
                                 d.Select(r => new XElement("AttributeValue", r.Field<string>("Primary_color")))
                                 ),
                                 new XElement("Attribute",
                                 d.Select(r => new XElement("AttributeName", "UpholysteryMaterial")),
                                 d.Select(r => new XElement("AttributeValue", r.Field<string>("UpholysteryMaterial")))
                                 ),
                                 new XElement("Attribute",
                                 d.Select(r => new XElement("AttributeName", "WeightCapacity")),
                                 d.Select(r => new XElement("AttributeValue", r.Field<string>("Weight_capacity")))
                                 ),
                                 new XElement("Attribute",
                                 d.Select(r => new XElement("AttributeName", "SeatAreaWidth")),
                                 d.Select(r => new XElement("AttributeValue", r.Field<string>("SeatAreaWidth")))
                                 ),
                                 new XElement("Attribute",
                                 d.Select(r => new XElement("AttributeName", "SeatAreaDepth")),
                                 d.Select(r => new XElement("AttributeValue", r.Field<string>("SeatAreaDepth")))
                                 ),
                                 new XElement("Attribute",
                                 d.Select(r => new XElement("AttributeName", "SeatCapacity")),
                                 d.Select(r => new XElement("AttributeValue", r.Field<string>("SeatCapacity")))
                                 ),
                                 new XElement("Attribute",
                                 d.Select(r => new XElement("AttributeName", "SleepFunction")),
                                 d.Select(r => new XElement("AttributeValue", r.Field<string>("SleepFunction")))
                                 ),
                                 new XElement("Attribute",
                                 d.Select(r => new XElement("AttributeName", "PackagesNumbers")),
                                 d.Select(r => new XElement("AttributeValue", r.Field<double>("Packages_Numbers")))
                                 ),
                                 new XElement("Attribute",
                                 d.Select(r => new XElement("AttributeName", "TotalWeight")),
                                 d.Select(r => new XElement("AttributeValue", r.Field<string>("Total_Weight")))
                                 ),
                                 new XElement("Attribute",
                                 d.Select(r => new XElement("AttributeName", "AdultAssemblyRequired")),
                                 d.Select(r => new XElement("AttributeValue", r.Field<string>("AdultAssemblyRequired")))
                                 ),
                                 new XElement("Attribute",
                                 d.Select(r => new XElement("AttributeName", "AssemblyLevel")),
                                 d.Select(r => new XElement("AttributeValue", r.Field<string>("Assembly_Level")))
                                 ),
                                 new XElement("Attribute",
                                 d.Select(r => new XElement("AttributeName", "Backtype")),
                                 d.Select(r => new XElement("AttributeValue", r.Field<string>("Backtype")))
                                 ),
                                 new XElement("Attribute",
                                 d.Select(r => new XElement("AttributeName", "FrameMaterial")),
                                 d.Select(r => new XElement("AttributeValue", r.Field<string>("FrameMaterial")))
                                 ),
                                 new XElement("Attribute",
                                 d.Select(r => new XElement("AttributeName", "Framewoodtype")),
                                 d.Select(r => new XElement("AttributeValue", r.Field<string>("Framewoodtype")))
                                 )
                             ),
                             new XElement("VolumeDimensions",
                             d.Select(r => new XElement("Width", r.Field<string>("Width"))),
                             d.Select(r => new XElement("Height", r.Field<string>("Height"))),
                             d.Select(r => new XElement("Length", r.Field<string>("Length"))),
                             d.Select(r => new XElement("Depth", r.Field<string>("Depth")))
                            )



                    )
                )
            );

When i save file like that i have emepty Photos section that looks like it :

 <Photos>
      <Photo>
        <Url>https://some.pl/Url>
        <IsPrimary>true</IsPrimary>
      </Photo>
      <Photo>
        <IsPrimary>false</IsPrimary>
      </Photo>
      <Photo>
        <IsPrimary>false</IsPrimary>
      </Photo>
      <Photo>
        <IsPrimary>false</IsPrimary>
      </Photo>
      <Photo>
        <IsPrimary>false</IsPrimary>
      </Photo>
      <Photo>
        <Url>https://some.pl</Url>
        <IsPrimary>false</IsPrimary>
      </Photo>
      <Photo>
        <IsPrimary>false</IsPrimary>
      </Photo>
      <Photo>
        <IsPrimary>false</IsPrimary>
      </Photo>
      <Photo>
        <IsPrimary>false</IsPrimary>
      </Photo>
      <Photo>
        <IsPrimary>false</IsPrimary>
      </Photo>
    </Photos>

Im trying to avoid add empety photos. Should be without <IsPrimary>false</IsPrimary> where there is no <Url> section.

So output should looks like :

 <Photos>
      <Photo>
        <Url>https://some.pl/Url>
        <IsPrimary>true</IsPrimary>
      </Photo>
      <Photo>
        <Url>https://some.pl</Url>
        <IsPrimary>false</IsPrimary>
      </Photo>
 </Photos>

Just dont add Photo section where urdl don't exists.

Can someone help with that? I try with ?? operators but can't find solution to not add Photo section where there is no URL exists.


Solution

  • I think this code will fix what you want and the code is much clear

        var root = new XElement("Catalog",
            departments.Select(
                d => new XElement("Photos",
                CreateElement(d,"Photo" ,"Url", "ImageURL1","true"),
                CreateElement(d, "Photo","Url", "ImageURL3","false")
        )));
    
    public XElement CreateElement(System.Linq.IGrouping<string, DataRow> d, string groupName,
                                                      string name, string column, string isPrimary)
    {
        var val = d.Select(r => r.Field<string>(column));
    
        if (!val.Any(x => x == null))
            return new XElement(groupName,
             d.Select(r => new XElement(name, r.Field<string>(column))),
             new XElement("IsPrimary", isPrimary)
            );
        return null;
    }