1

このデータを解析しようとしています:

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

部品番号のリストを取得しようとしていますが、最初のものしか表示されません:

製品カテゴリ Climate Guard 部品番号 Climate Guard

私の部品番号コードの問題点:

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

4

2 に答える 2

1

現在、要素値のコレクションを取得する代わりに、最初の子の値を持つPartNumber親の要素のみを取得しています。文字列値の単純なリストの代わりにクラスが必要な場合は、次のようになります。PartNumbersPartNumberPartNumbers

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要素ProductCategoriesa製品など)?また、簡単に部品番号を保存することもできますList<string>(そのためのクラスを作成せずに):

PartNumbers = b.Element("PartNumbers").Elements().Select(c => (string)c).ToList()
于 2013-01-29T16:40:13.720 に答える
0

ToList()for ProductCategoriesPartNumbersおよび を忘れている可能性がありDownloadsます。

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();
}
于 2013-01-29T16:39:04.953 に答える