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