簡體   English   中英

解析層級Linq到XML

[英]Parse Hierarchial Linq to XML

我正在嘗試解析此數據:

    <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。

當前,您沒有獲得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<string>來存儲部件號(無需為此創建類):

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

您可能已經忘記了ToList()ProductCategoriesPartNumbersDownloads

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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM