添加节点有问题

时间:2014-04-23 11:52:11

标签: c# linq dynamic element

现在我有

 doc = new XDocument(
        new XElement(xmlns + "displayMLResponse",
            new XAttribute("xmlns", "http://www.peek.se/DisplayML/"),
            new XAttribute("version", "1.12"),
            new XAttribute("dateTime", date),
            new XElement("getStatusResponse",
                new XElement("systemInformation",
                    systemInformationList.Select(info => new XElement("item",
                        new XElement("name", info.name),
                        new XElement("value", info.value))).Where(item => item != null)),
                responceList.Select(fault => responceList.Count != 0 ?
                    new XElement("faults",
                        new XElement("systemFault",
                            new XElement(fault.faultType,
                                new XAttribute("description", fault.description),
                                fault.name.Length == 0 ? new XAttribute("name", fault.name) : null,
                                fault.size.Length == 0 ? new XAttribute("size", fault.size) : null))) 
                    : new XElement("OK"))
                    )));

问题是如果 responceList 为空,则不会添加new XElement("OK"),因为它不会评估responceList.Select(..)内的内容,因为它是空的。

无法解决我必须做的问题。
问题是如果添加元素错误,如果有其他添加元素确定

我正在尝试创建:

<displayMLResponse xmlns="http://www.peek.se/DisplayML/" version="1.12"
dateTime="2001-12-17T09:30:47">
    <getStatusResponse>
        <systemInformation>
            <item>
                <name>Manufacturer</name>
                <value>PEEK</value>
            </item>
            <item>
                <name>Version</name>
                <value>1.0.0</value>
            </item>
        </systemInformation>
        <OK/>
    </getStatusResponse >
</displayMLResponse>

确定替换为:

<faults>
    <systemFault>
        <missingTemplateFault name="templateAlfa"/>
    </systemFault>
    <systemFault>
        <missingFontFault name="arial" size="18"/>
    </systemFault>
</faults>

如果有任何错误,在这种情况下 responceList 是一个错误列表

2 个答案:

答案 0 :(得分:0)

responceList.Select(lamba)是一个'select函数',它将为responseList中的每个项运行_once,以决定它是否包含在输出中,因此

fault => responceList.Count != 0 ? ...
如果responseList处于非空状态,

将仅在ALL处运行,因此是多余的。

我想你想要:

            ...
            new XElement("value", info.value))).Where(item => item != null)), 
                 responceList.Count != 0 ?  responceList.Select(fault => 
                   new XElement("faults",
                       new XElement("systemFault",
                           new XElement(fault.faultType,
                               new XAttribute("description", fault.description),
                               fault.name.Length == 0 ? new XAttribute("name", fault.name) : null,
                               fault.size.Length == 0 ? new XAttribute("size", fault.size) : null))) 
                 : new XElement("OK"))

即你在内部选择之外进行默认,所以它会被调用。

答案 1 :(得分:0)

由于我没有得到答案,我将其添加为解决方法。

    doc = new XDocument(
        new XElement(xmlns + "displayMLResponse",
            new XAttribute("xmlns", "http://www.peek.se/DisplayML/"),
            new XAttribute("version", "1.12"),
            new XAttribute("dateTime", date),
            new XElement("getStatusResponse")));


    XElement ele = doc.Root.Element("getStatusResponse");

    if (systemInformationList.Count != 0)
    {
        ele.Add(new XElement("systemInformation",
                    systemInformationList.Select(info => new XElement("item",
                        new XElement("name", info.name),
                        new XElement("value", info.value))).Where(item => item != null)));
    }

    if(responceList.Count != 0)
    {
        ele.Add(responceList.Select(fault => 
                    new XElement("faults",
                        new XElement("systemFault",
                            new XElement(fault.faultType,
                                new XAttribute("description", fault.description),
                                fault.name.Length == 0 ? new XAttribute("name", fault.name) : null,
                                fault.size.Length == 0 ? new XAttribute("size", fault.size) : null)))));
    } else
    {
        ele.Add(new XElement("OK"));
    }