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

标签 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。我尝试添加 < b r/> 等标签,但找不到我的错误,如何将 Spec 获取到三个不同的字符串,而不仅仅是一个字符串。如何实现?

最佳答案

我不确定你为什么要用自己加入节点,但根据你的 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[]

关于c# - 如何使用linq从xml中获取具有相同名称的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48661029/

相关文章:

java - Android 在执行 HttpGet 请求时崩溃

c# - 如何更改应用程序的初始屏幕位置?

c# - 使用 32feet.NET 在 Windows 10 上进行蓝牙配对 (SSP)

html - div/body height 100%固溶

javascript - jQuery UI 日期选择器无法正常工作

java - PropertyPlaceholderConfigurer 与 Hibernate.cfg.xml

C#、OLEDB从指定行读取Excel文件

c# - 如何向 Canvas 元素添加多条折线?

html - 如何让子菜单向左下拉?

java - 如何找到XML文件中最大的属性值?