使用C#中的LINQ创建特定的XML

时间:2014-01-13 12:51:44

标签: c# xml linq

我正在尝试创建以下XML元素:

<result>
    <object1>VALUE_1</object1>
    <object2>VALUE_2</object2>
    <object3>VALUE_3</object3>
    <object4>VALUE_4</object4>
</result>

我有以下代码:

XElement xResult = new XElement("node_results",
                from
                    a in entityResult
                select new XElement("result"
                    , new XElement("object1", a.VALUE_1
                    , new XElement("object2", a.VALUE_2)
                    , new XElement("object3", a.VALUE_3)
                    , new XElement("object4", a.VALUE_4)
                )
            );

此代码生成此XML:

<node_results>
    <result>
        <object1>VALUE_1</object1>
        <object2>VALUE_2</object2>
        <object3>VALUE_3</object3>
        <object4>VALUE_4</object4>
    </result>
</node_results>

如何在没有标记“node_results”的情况下生成生成的xml?

我已经使用过这些代码,但会产生错误:

XElement xResult =
                from
                    a in entityResult
                select new XElement("result"
                    , new XElement("object1", a.VALUE_1
                    , new XElement("object2", a.VALUE_2)
                    , new XElement("object3", a.VALUE_3)
                    , new XElement("object4", a.VALUE_4)
            );

or

XElement xResult = new XElement("result",
                from
                    a in entityResult
                select
                     new XElement("object1", a.VALUE_1)
                    , new XElement("object2", a.VALUE_2)
                    , new XElement("object3", a.VALUE_3)
                    , new XElement("object4", a.VALUE_4)
                )
            );

2 个答案:

答案 0 :(得分:0)

entityResult显然是一个结果数组,因此您无法将其分配给XElement,但必须创建它们的IEnumerable。

这应该有效:

var xResults =
            from
                a in entityResult
            select new XElement("result"
                , new XElement("object1", a.VALUE_1
                , new XElement("object2", a.VALUE_2)
                , new XElement("object3", a.VALUE_3)
                , new XElement("object4", a.VALUE_4)
        );

重要的区别是xResults将是IEnumerable<XElement>,因此结果如下:

<result>
   <object1>VALUE_1</object1>
   <object2>VALUE_2</object2>
   <object3>VALUE_3</object3>
   <object4>VALUE_4</object4>
</result>
<result>
   <object1>VALUE_1</object1>
   <object2>VALUE_2</object2>
   <object3>VALUE_3</object3>
   <object4>VALUE_4</object4>
</result>
...

因此,您需要将它们包装在根元素中。第二种方法是枚举其中一个结果:

XElement xResult = new XElement("result"
                , new XElement("object1", entityResult[0].VALUE_1
                , new XElement("object2", entityResult[0].VALUE_2)
                , new XElement("object3", entityResult[0].VALUE_3)
                , new XElement("object4", entityResult[0].VALUE_4) );

这实际上取决于你需要或想做什么。

要防止自闭标记,只需用空字符串替换空值:

XElement xResult = new XElement("result"
                , new XElement("object1", entityResult[0].VALUE_1 ?? ""
                , new XElement("object2", entityResult[0].VALUE_2 ?? "")
                , new XElement("object3", entityResult[0].VALUE_3 ?? "")
                , new XElement("object4", entityResult[0].VALUE_4 ?? "") );

?? 运算符检查,如果左侧等于null,如果不是,则输出此左侧值,否则输出右侧值。

EDIT2:显然这不起作用 - 所以另一个解决方案 - How do you force explicit tag closing with Linq XML?。看看R. Martinho Fernandes的答案 - 他有一个完整的例子来创建一个解决你的问题的自定义XMLWriter。

答案 1 :(得分:0)

我假设entityResult是一个只包含单个元素的集合。

var a = entityResult.Single();
XElement xResult = XElement("result",
    new XElement("object1", a.VALUE_1),
    new XElement("object2", a.VALUE_2),
    new XElement("object3", a.VALUE_3),
    new XElement("object4", a.VALUE_4));