试图了解如何使用LIINQToXML有条件地写出元素/属性

时间:2016-02-09 15:33:28

标签: linq c#-4.0 linq-to-xml

这是我第一次使用LINQToXML创建XML文档。 我试图了解在创建文档时如何有条件地创建属性(或元素)?

在此示例中,给定的汽车可能/可能没有它的特征,因此在这种情况下我不想创建该元素,我也可能在特征节点中具有可能丢失的某些属性。

我怎样才能处理这些情况?

 XDocument xDoc = new XDocument(
                new XElement("root", 
                    new XElement("NodeA"),   
                    new XElement("Cars", 
                        from p in listCars
                        select new XElement("Car", new XAttribute("name", p.CarName),
                            new XElement("Feature", new XAttribute("door", p.Door), new XAttribute("model", p.Model))
                            )
                        )
                )
                );

期望的结果#1(给定车辆的所有功能都缺失):

<root>
    <NodeA />
    <Cars>
        <Car name="Honda">      
            <Feature door="4" model="Accord"  />
        </Car>
        <Car name="Ford" />     
    </Cars>
</root>

期望的结果#2(可能存在某些功能)

<root>
    <NodeA />
    <Cars>
        <Car name="Honda">      
            <Feature door="4" model="Accord"  />
        </Car>
        <Car name="Ford">       
            <Feature model="Focus"  />
        </Car>
    </Cars>
</root>

2 个答案:

答案 0 :(得分:2)

这里有2个单独的解决方案。要么使用方法来创建要素节点,要么全部一起完成:

    static void Main(string[] args)
    {
        var listCars = new List<Car>();
        listCars.Add(new Car { CarName = "test 1", Door = "0", Model = "" });
        listCars.Add(new Car { CarName = "test 2", Door = "", Model = "" });
        listCars.Add(new Car { CarName = "test 3", Door = "0", Model = "0" });

        XDocument xDoc2 = new XDocument(
               new XElement("root",
                   new XElement("NodeA"),
                   new XElement("Cars",
                       from p in listCars
                       select new XElement("Car",
                           new XAttribute("name", p.CarName),
                           p.Door != "" || p.Model != "" ? 
                            new XElement("Feature",
                                p.Door != "" ? new XAttribute("door", p.Door) : null,
                                p.Model != "" ? new XAttribute("model", p.Model) : null) : null
                           )
                       )
               )
               );


        XDocument xDoc = new XDocument(
               new XElement("root",
                   new XElement("NodeA"),
                   new XElement("Cars",
                       from p in listCars
                       select new XElement("Car",
                           new XAttribute("name", p.CarName),
                           CreateFeature(p)
                           )
                       )
               )
               );
    }

    static XElement CreateFeature(Car p)
    {
        var el = new XElement("Feature",
            p.Door != "" ? new XAttribute("door", p.Door) : null,
            p.Model != "" ? new XAttribute("model", p.Model) : null);
        return !el.Attributes().Any() ? null : el;
    }

答案 1 :(得分:1)

如果您提供null而不是元素,它将被忽略,因此您可以使用如下结构。

p.CarName != null ? new XAttribute("name", p.CarName) : null

如果您正在使用C#6,则可以使用空传播。