如何使用linq从xml获取具有相同名称的不同值

时间:2018-02-07 10:09:23

标签: c# html xml linq

XML - 代码:

<Store>
   <Products>
      <Product id="PROD01">
         <Title>Product 1</Title>
         <Description><![CDATA[Product <b>1</b> description]]></Description>
         <Image>prod01.gif</Image>
         <Specs>
            <Spec>Good computer</Spec>
            <Spec>Good display</Spec>
            <Spec>Latest version</Spec>
         </Specs>
         <Availability>same day</Availability>
      </Product>
      <Product id="PROD02">
         <Title>Product 2</Title>
         <Description><![CDATA[Product <b>2</b> description]]></Description>
         <Image>prod01.gif</Image>
         <Specs>
            <Spec>Good computer</Spec>
            <Spec>Soon available</Spec>
         </Specs>
         <Availability>next day</Availability>
      </Product>
   </Products>
</Store>

C# - 代码:

public List<DetailList> GetDetails()
{
    DetailList d = new DetailList();
    List<DetailList> DetailLists = 
        (from product in xdocList.Descendants("Product")
        join detail in xdocDetail.Descendants("Product")
        on (string)product.Attribute("id") equals (string)detail.Attribute("id") 
        into outerProducts
        from outerProduct in outerProducts

        select new DetailList
        {
            Detail1 = (string)product.Attribute("id"),
            Detail2 = (string)product.Element("Title"),
            Detail3 = (string)product.Element("Description"),
            Detail4 = (string)product.Element("Image"),
            Detail5 = (string)outerProduct.Elements("Specs")
            Detail6 = (string)outerProduct.Element("Availability"),
            Detail7 = (string)product.Element("Price"),
        }).ToList();
    return DetailLists;
}

输出:好电脑好显示最新版本

但想要的输出是:

好电脑
良好的显示
最新版本

对于输出我使用了asp:repeater。我试图添加像&lt; b r />还有更多,但不能找到我的错误,如何让Spec获得三个不同的字符串,而不仅仅是一个字符串。如何实现?

2 个答案:

答案 0 :(得分:2)

我不确定您为什么要使用self加入节点,但根据您的XML,它不是必需的。您可以像这样简单地投影元素: -

public static List<DetailList> GetDetails(XDocument xdocList)
{
    DetailList d = new DetailList();
    List<DetailList> DetailLists = (from product in xdocList.Descendants("Product")
                                    select new DetailList
                                    {
                                        Detail1 = ((string)product.Attribute("id")),
                                        Detail2 = ((string)product.Element("Title")),
                                        Detail3 = ((string)product.Element("Description")),
                                        Detail4 = ((string)product.Element("Image")),
                                        Detail5 = product.Element("Specs")
                                                   .Elements("Spec")
                                                   .Select(x => (string)x).ToList(),
                                        Detail6 = ((string)product.Element("Availability")),
                                        Detail7 = ((string)product.Element("Price")),
                                     }).ToList();
            return DetailLists;
}

由于您需要单独使用所有Specs,因此您应该拥有字符串集合而不仅仅是字符串。所以属性Detail5数据类型应该是: -

List<string> or string[]

答案 1 :(得分:1)

朋友从Rahul获得解决方案

Detail5 = String.Join("<br/>", outerProduct.Element("Specs").Elements("Spec").Select(x => (string)x).ToList()),

谢谢#Rahul Singh