c#当元素之前为空时不要作为新的 XElement

问题描述 投票:0回答:1

我正在尝试从代码生成 XML:

   //// 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")))
                            )



                    )
                )
            );

当我像这样保存文件时,我有一个看起来像这样的空照片部分:

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

我尽量避免添加空白照片。没有部分的地方应该没有false

所以输出应该是这样的:

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

只是不要在 urdl 不存在的地方添加照片部分。

有人可以帮忙吗?我试试 ??运营商,但找不到不添加不存在 URL 的照片部分的解决方案。

c# xml linq-to-xml
1个回答
0
投票

我认为这段代码会解决你想要的,而且代码非常清晰

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

© www.soinside.com 2019 - 2024. All rights reserved.