【问题标题】:Parse Hierarchial Linq to XML将层次结构 Linq 解析为 XML
【发布时间】:2013-01-29 16:36:14
【问题描述】:

我正在尝试解析这些数据:

    <Product>
    <ProductName>Climate Guard</ProductName>
    <Tag>ClimateGuard</Tag>
    <SupportPage>~/Support/ClimateGuard.aspx</SupportPage>
    <ProductPage>~/Products/ClimateGuard.aspx</ProductPage>
    <ProductCategories>
        <ProductCategory>Climate Guard</ProductCategory>
        <PartNumbers>
            <PartNumber Primary="true">CLIMATE GUARD</PartNumber>
            <PartNumber>CLIMATEGUARD LT</PartNumber>
            <PartNumber>CLIMATE GUARD STARTER KIT</PartNumber>
            <PartNumber>SENSOR MODULE</PartNumber>
            <PartNumber>SWCH INP MODULE</PartNumber>
            <PartNumber>TEMP SENSOR</PartNumber>
            <PartNumber>HUMIDITY SENSOR</PartNumber>
            <PartNumber>DOOR CONTACT</PartNumber>
            <PartNumber>MOTION SENSOR</PartNumber>
            <PartNumber>FLOOD DETECTOR</PartNumber>
            <PartNumber>SMOKE DETECTOR</PartNumber>
            <PartNumber>TILT SENSOR</PartNumber>
            <PartNumber>SENSOR CABLE</PartNumber>
            <PartNumber>PWR INP CABLE</PartNumber>
            <PartNumber>100FT 2-WIRE</PartNumber>
            <PartNumber>RJ25 COUPLER</PartNumber>
        </PartNumbers>
    </ProductCategories>
    <Downloads>
        <Download>
            <Version>1.0.27</Version>
            <Url>~/Files/Downloads/ClimateGuard_Firmware_1_0_27.bin</Url>
            <Comment>Firmware</Comment>
        </Download>
        <Download>
            <Version>1.0.6</Version>
            <Url>~/Files/Downloads/ClimateGuard_BuiltInModule_1_0_6.bin</Url>
            <Comment>Built-in Module</Comment>
        </Download>
        <Download>
            <Version>1.0.2</Version>
            <Url>~/Files/Downloads/ClimateGuard_SensorModule_1_0_2.bin</Url>
            <Comment>Sensor Module</Comment>
        </Download>
        <Download>
            <Version>1.0.0</Version>
            <Url>~/Files/Downloads/ClimateGuard_SwitchInputModule_1_0_0.bin</Url>
            <Comment>Switch Input Module</Comment>
        </Download>
    </Downloads>
</Product>

我正在尝试获取零件编号列表,但是,只有第一个出现:

产品类别气候卫士 部件号气候防护罩

我的零件编号代码有什么问题:

public List<Products> GetProducts()
{
    XElement myElement = XElement.Load(HttpContext.Current.Server.MapPath("~/App_Data/products.xml"));
    var query = from a in myElement.Elements("Product")
                select new Products
                {
                    ProductName = a.Element("ProductName").Value,
                    Tag = a.Element("Tag").Value,
                    SupportPage = a.Element("SupportPage").Value,
                    ProductPage = a.Element("ProductPage").Value,
                    ProductCategories = from b in a.Elements("ProductCategories")
                                        select new ProductCategories
                                        {
                                            ProductCategory = b.Element("ProductCategory").Value,
                                            //PartNumbers = GetPartNumbers(myElement.Elements("Product").Elements("ProductCategories").Elements("PartNumbers").Elements("PartNumber"))
                                            PartNumbers = from c in b.Elements("PartNumbers")
                                                          select new PartNumbers
                                                          {
                                                               PartNumber = c.Element("PartNumber").Value
                                                          }
                                        },
                    Downloads = from bb in a.Elements("Downloads").Elements("Download")
                                select new Downloads
                                {
                                    Comment = bb.Element("Comment").Value,
                                    Url = bb.Element("Url").Value,
                                    Version = bb.Element("Version").Value
                                },
                };

    return query.ToList();
}

所有类型(ProductName、Tag 等)都是字符串。 PartNumbers 是一个 IEnumerable。

【问题讨论】:

    标签: c# linq xml-parsing


    【解决方案1】:

    目前,您不会获取 PartNumber 元素值的集合,而是仅获取其父级 PartNumbers 的元素,其值为内部的第一个 PartNumber 子级。如果你想要 PartNumbers 类而不是简单的字符串值列表,那么它应该如下所示:

    public class PartNumbers
    {
        // list instead of single value
        public List<string> Numbers { get; set; } 
    }
    

    而且应该这样解析:

    PartNumbers = new PartNumbers {
           Numbers = b.Element("PartNumbers").Elements()
                      .Select(c => (string)c).ToList()
           }
    

    顺便说一句,您为什么选择如此奇怪的范围变量名称(b 用于 ProductCategories 元素,a 用于产品等)?您也可以使用简单的List&lt;string&gt; 来存储零件编号(无需为此创建类):

    PartNumbers = b.Element("PartNumbers").Elements().Select(c => (string)c).ToList()
    

    【讨论】:

      【解决方案2】:

      您可能忘记了 ProductCategoriesPartNumbersDownloadsToList()

      public List<Products> GetProducts()
      {
          XElement myElement = XElement.Load(HttpContext.Current.Server.MapPath("~/App_Data/products.xml"));
          var query = from a in myElement.Elements("Product")
                      select new Products
                      {
                          ProductName = a.Element("ProductName").Value,
                          Tag = a.Element("Tag").Value,
                          SupportPage = a.Element("SupportPage").Value,
                          ProductPage = a.Element("ProductPage").Value,
                          ProductCategories = (from b in a.Elements("ProductCategories")
                                              select new ProductCategories
                                              {
                                                  ProductCategory = b.Element("ProductCategory").Value,
                                                  //PartNumbers = GetPartNumbers(myElement.Elements("Product").Elements("ProductCategories").Elements("PartNumbers").Elements("PartNumber"))
                                                  PartNumbers = (from c in b.Elements("PartNumbers")
                                                                select new PartNumbers
                                                                {
                                                                     PartNumber = c.Element("PartNumber").Value
                                                                }).ToList()
                                              }).ToList(),
                          Downloads = (from bb in a.Elements("Downloads").Elements("Download")
                                      select new Downloads
                                      {
                                          Comment = bb.Element("Comment").Value,
                                          Url = bb.Element("Url").Value,
                                          Version = bb.Element("Version").Value
                                      }).ToList(),
                      };
      
          return query.ToList();
      }
      

      【讨论】:

        猜你喜欢
        • 2018-02-23
        • 2014-03-18
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-25
        相关资源
        最近更新 更多