【问题标题】:Creating specific XML with LINQ in C#在 C# 中使用 LINQ 创建特定的 XML
【发布时间】:2014-01-13 12:51:43
【问题描述】:

我正在尝试创建以下 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)
                )
            );

【问题讨论】:

  • 什么错误?始终将它们包含在问题中。

标签: c# xml linq


【解决方案1】:

我假设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));

【讨论】:

    【解决方案2】:

    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&lt;XElement&gt;,因此结果类似于:

    <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 来解决您的问题。

    【讨论】:

    • 此代码有效。谢谢姆泽特科。当元素的值为空时,有没有办法不显示标签 ?为null时,xml显示标签
    • 那么您可以在代码中使用条件 if null :第二行的示例 - ... entityResult[0].VALUE_2 ?? "")
    • 用示例更新了我的答案。
    • 那个??运算符不起作用。如果值为 null 或为空,则生成的 xml 包含自结束标记。有没有其他方法可以解决这个问题?
    • 更新了我的答案 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 2012-01-28
    • 1970-01-01
    相关资源
    最近更新 更多