簡體   English   中英

Linq to XML查詢分析

[英]Linq to XML query analyz

該查詢確實有效,但是我不確定這是編寫這種查詢的正確方法。 我覺得它使用了太多的后代和父母。

有沒有更好的方法來編寫此查詢?

XML可以有多個目錄。

static IEnumerable<Parts> GetAllParts(XDocument doc, string catalog, string groupId, string subGroupId)
    {
        var parts = (from p in doc.Descendants("ROOT").Descendants("CATALOG").Descendants("GROUP").Descendants("SUBGROUP").Descendants("BOM").Descendants("PARTS")
                     where (string)p.Parent.Parent.Parent.Parent.Element("IDENT").Value == catalog
                            && p.Parent.Parent.Parent.Element("IDENT").Value == groupId
                            && p.Parent.Parent.Element("IDENT").Value == subGroupId

                     select new Parts
                     {
                         ObjectId = int.Parse(p.Attribute("OBJECTID").Value),
                         Ident = p.Element("IDENT").Value,
                         List = p.Element("LIST").Value,
                         Descr = p.Element("DESC").Value
                     });


        return parts;

    }
}

public class Parts
{
    public int ObjectId { get; set;}
    public string Descr { get; set; }
    public string Ident { get; set;  }
    public string List { get; set; }
}

更新:添加了XML。

<ROOT>
    <CATALOG>
        <OBJECT_ID>001</OBJECT_ID>
        <OBJECT_IDENT>X001</OBJECT_IDENT>
        <GROUP>
            <OBJECT_ID>1001</OBJECT_ID>
            <OBJECT_IDENT>01</OBJECT_IDENT>
            <NAME>HOUSING</NAME>

            <SUBGROUP>              
                <OBJECT_ID>5001</OBJECT_ID>
                <OBJECT_IDENT>01.05</OBJECT_IDENT>
                <NAME>DESIGN GROUP 1</NAME>
                <BOM>
                    <OBJECT_ID>6001</OBJECT_ID>
                    <OBJECT_IDENT>010471</OBJECT_IDENT>
                    <PARTS>
                        <OBJECT_ID>2316673</OBJECT_ID>
                        <OBJECT_IDENT>A002010660</OBJECT_IDENT>
                        <DESC>SHORT BLOCK</DESC>
                        <NOTES>
                            <ROW>
                                <NOTES>Note 1</NOTES>
                                <BOM>010471</BOM>
                                <POS>1</POS>
                            </ROW>
                            <ROW>
                                <NOTES>Note 2</NOTES>
                                <BOM>010471</BOM>
                                <POS>2</POS>
                            </ROW>
                        </NOTES>
                    </PARTS>
                    <PARTS>
                    </PARTS>
                    <PARTS>
                    </PARTS>
                </BOM>
            </SUBGROUP>

            <SUBGROUP>              
            </SUBGROUP>
            <SUBGROUP>              
            </SUBGROUP>

        </GROUP>

        <GROUP>
        </GROUP>

    </CATALOG>
</ROOT>

有關您的問題的一些建議(希望您以后的帖子會有所改善):

  1. 您的代碼和發布的XML不起作用。 例如,XML具有<OBJECT_IDENT>元素,但您的LINQ具有IDENT 請仔細制作,並確保它確實有效,以免造成混淆。

  2. 請付出一些努力來解釋問題並進行澄清。 “我正在按照函數名稱的說明來獲取零件數據”還不夠清楚,因為僅獲取<Parts>元素不需要過濾, 但是您的LINQ具有where ....子句。

  3. 這個問題似乎更適合https://codereview.stackexchange.com/

以下是有關您的代碼的一些建議:

  1. 使用.Elements()獲取當前節點的直接子節點,而使用Descendants()則獲取所有后代節點。

  2. 您可以使用Elements().Where()來過濾元素,從而避免遍歷Parent

  3. 您可以將XElementstring / int以避免異常(如果找不到此類元素)

示例代碼段:

var parts = (from p in doc.Root
              .Elements("CATALOG").Where(o => catalog == (string)o.Element("OBJECT_IDENT"))
              .Elements("GROUP").Where(o => groupId == (string)o.Element("OBJECT_IDENT"))
              .Elements("SUBGROUP").Where(o => subGroupId == (string)o.Element("OBJECT_IDENT"))
              .Elements("BOM")
              .Elements("PARTS")
             select new Parts
             {
                 ObjectId = (int)p.Element("OBJECT_ID"),
                 Ident = (string)p.Element("OBJECT_IDENT"),
                 List = (int)p.Element("LIST"),
                 Descr = (string)p.Element("DESC")
             });

暫無
暫無

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

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