使用linq替换string.empty和Show“Null”到xml?

时间:2012-09-14 09:55:42

标签: linq linq-to-xml

我需要显示null或零,而不是显示字符串为空。

Xml回复:

<Items>
   <Item>
     <ASIN>111</ASIN>
      <ItemAttributes>
       <Title>xxx</Title>
      <ListPrice>
        <Currency>USD</Currency>
         <FormattedPrice>45.25</FormattedPrice>
        </ListPrice>
        </ItemAttributes>
        <Variation>
        <Item>
         <ItemAttributes>
            <Title>yes</Title>
          </ItemAttributes>
        </Item>
        </Variation>
     </Item>
   <Item>
     <ASIN>222</ASIN>
      <ItemAttributes>
       <Title>yyy</Title>
       </ItemAttributes>
         <Variation>
        <Item>
         <ItemAttributes>
            <Title>No</Title>
          </ItemAttributes>
        </Item>
        </Variation>
    </Item>
   <Items>

这是我的代码。

var Price1 = xd.Descendants(ns + "ListPrice").Select(c => new
{
    PPrice = (c.Element(ns + "FormattedPrice") != null) ? 
             c.Element(ns + "FormattedPrice").Value : **string.Empty**
}).ToList();

如何将String.Empty替换为“Null”或0之类的值。提前感谢。  如果“FormattedPrice”不适用于第二项,那么从Xml响应开始  在列表中显示或为null。

2 个答案:

答案 0 :(得分:1)

目前尚不清楚为什么你在这里使用匿名类型,如果使用显式string转换,你也可以避免使用条件运算符。当然,您可以轻松地将string.Empty更改为"null",并且真的应该可以正常工作 - 如果不是,则会出现其他问题。

无论如何,这里是使用“Null”的简化代码(以及更常规的变量名称):

var prices = xd.Descendants(ns + "ListPrice")
               .Select(c => ((string) c.Element(ns + "Price")) ?? "0")
               .ToList();

你可能不需要(string) c.Element(ns + "FormattedPrice")周围的括号 - 我不记得在演员表或空合并运算符之外有什么优先级。

编辑:要处理没有ListPrice元素的情况,如果您已经处于单项的级别,则可以使用:

var price = (string) item.Element(ns + "ListPrice").Element(ns + "Price") ?? "0";

获取价格列表并以某种方式推断在ListPrice缺席时插入“0”的位置将要求您找到Items,例如

var prices = xd.Descendants(ns + "Item")
               .Select(item => item.Elements("ListPrice")
                                   .Select(c => (string) c.Element(ns + "Price"))
                                   .FirstOrDefalut() ?? "0")
               .ToList();

这只是 的价格,而不是其他商品数据,这将是非常奇怪的。

答案 1 :(得分:0)

这是上述问题的解决方案。

var Title = xd.Descendants(ns + "Items").Elements(ns + "Item").Select(DVDTitle =>DVDTitle.Elements(ns + "ItemAttributes").Select(DVDTitle1 => (string)DVDTitle1.Element(ns + "Title")).FirstOrDefault() ?? "Null").ToList();