LINQ to XML新手问题

时间:2009-04-16 16:49:44

标签: c# xml linq

有更好的方法来做这件事:

var filter = new CashFilters();
var element = XElement.Parse(request.OuterXml);

var productId = element.Elements("ProductId").Select(el => el);

if (productId.Count() == 1)
    filter.ProductId = Convert.ToInt32(productId.Single().Value);

2 个答案:

答案 0 :(得分:2)

好吧,Select(el => el)对你开始没有任何帮助。

我建议您使用SingleOrDefault

var productId = element.Elements("ProductId").SingleOrDefault();
if (productId != null)
    filter.ProductId = Convert.ToInt32(productId.Value);

请注意,这会处理 no ProductId元素的情况,但如果有多个,则会抛出异常。如果这实际上是一个有效的案例,那么您当前的代码(没有多余的Select调用)是合理的。

编辑:你可以远离这个:

var productId = element.Elements("ProductId")
                       .Select(elt => elt.Value)
                       .SingleOrDefault();
filter.ProductId = Convert.ToInt32(productId ?? filter.ProductId.ToString());

但那太可怕了;)

基本上你有一个条件 - 你只想设置ProductId如果它被指定。 “if”语句是有条件执行代码的普遍接受的方式:)

还有其他选择:

filter.ProductId = productId == null 
                   ? filter.ProductId 
                   : int.Parse(productId);

如果你不介意filter.ProductId如果没有指定ID就设置为0,那么你可以使用:

filter.ProductId = Convert.ToInt32(element.Elements("ProductId")
                                          .Select(elt => elt.Value)
                                          .SingleOrDefault());

(由于传递空参数时Convert.ToInt32返回0的方式。)

答案 1 :(得分:1)

你真的需要在Linq到Xml中这样做吗?对我来说,Xml DOM方法似乎更合理。

您是否考虑过纯Xml方法?

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(request.OuterXml);

    var node = doc.SelectSingleNode("//ProductId[1]");
    if (node != null)
        filter.ProductId = Convert.ToInt32(node.InnerText);