簡體   English   中英

從屬性值XML C#讀取所有匹配項

[英]Reading all matches from attribute value XML C#

我有一個使用xmlreader從xml文件中僅檢索一個值的代碼。

<recordset>
    <itemidlist>
        <itemid idtype = "plant">787484545</itemid>
        <itemid idtype = "seed">659988222</itemid>
    </itemidlist>
    <itemidlist>
        <itemid idtype = "plant">90327328</itemid>
        <itemid idtype = "seed">099849999</itemid>
    </itemidlist>
    <itemidlist>
        <itemid idtype = "plant">34545488</itemid>
        <itemid idtype = "seed">787555444</itemid>
    </itemidlist>
</recordset>

C#編碼了該條目:(s是xml文件)

using (var reader = XmlReader.Create(s))
{
    var nodecount = 0;
    var plant = "";
    var seed = "";
    var typeid = false;
    var typeid2 = false;
    while (reader.Read())
    {
        if (reader.NodeType == XmlNodeType.Element &&
            reader.Name == "recordset")
        {
            nodecount++;
        }

        if (reader.NodeType == XmlNodeType.Element &&
            reader.Name == "itemid")
        {
            var idtype = reader.GetAttribute("idtype");
            typeid = idtype == "plant";
            typeid2 = idtype == "seed";
        }
        while (typeid && reader.NodeType == XmlNodeType.Element &&
               reader.Name == "itemid")
        {
            plant = reader.ReadInnerXml();
        }
        while (typeid2 && reader.NodeType == XmlNodeType.Element &&
               reader.Name == "itemid")
        {
            seed = reader.ReadInnerXml();
        }
    }
}

當添加到datagridview時會發生這種情況:

僅找到一個記錄:植物種子787484545 659988222

您只需要設置seed和一個plant變量,因此,如果發現一個以上的值,它將被覆蓋。 您如何建議返回多個值?

有什么理由不為此使用LINQ to XML?

var doc = XDocument.Load(s);

var plants = doc.Descendants("itemid")
    .Where(x => (string) x.Attribute("idtype") == "plant")
    .Select(x => x.Value);

var seeds = doc.Descendants("itemid")
    .Where(x => (string) x.Attribute("idtype") == "seed")
    .Select(x => x.Value);

請參閱此小提琴以獲得有效的演示。

暫無
暫無

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

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