简体   繁体   中英

Loop through a specific node of XML with XmlNodeList

I have the following XML type file

<root>
<info version_id=... product_id=... account_id=...>
<CRM>
<result key=... value=...>
<result key=... value=...>
....
</CRM>
<result key=... value=....>
</info>

<info version_id=... product_id=... account_id=...>
<CRM>
<result key=... value=...>
<result key=... value=...>
....
</CRM>
<result key=... value=....>
</info>
</root>

I need for each "info" nodes to create the following list: list(account+product, key, value) And I must take only "key" and "value" information that are part of the CRM node.

So the close I want was with this code

string[] directoryXml = Directory.GetFiles(directory);
var listxmlresult = new List<XmlResultNode>();

foreach (var xmlfile in directoryXml)
{
    var docxml = new XmlDocument();
    docxml.Load(xmlfile);
    XmlNodeList nodesInfo = docxml.SelectNodes("//info");
    XmlNodeList nodesResult = docxml.SelectNodes("//info/CRM/result");


    foreach (XmlNode info in nodesInfo)
    {

        string VersionId = info.Attributes["version_id"].Value;
        string ProductId = info.Attributes["product_id"].Value;
        string AccountId = info.Attributes["account_id"].Value;
        string AccountProductId = AccountId + " : " + ProductId;


        // verify that CRM node exist

        if (docxml.SelectSingleNode("//info/CRM") == null)
        {
            //To do log info that CRM node is not available for the specific file
        }

        foreach (XmlNode result in nodesResult)
        {
            //To do verfiy value is empty

            string Key = result.Attributes["key"].Value;
            string Value = result.Attributes["value"].Value;

            if (Value.Length != 0)
            {
                var listXmlResultTemp = new XmlResultNode(AccountProductId, Key, Value);
                listxmlresult.Add(listXmlResultTemp);
            }
        }
    }
}

But this code return list with all "key" "value" for each "accountproduct".

I cannot manage in my second loop to just read the current node. I tried several xpath possibility but I cannot manage to take the current position with XmlNodeList.

Tks

It isn't very clear what you're trying to achieve as posted. I think you want to change the inner loop this way :

foreach (XmlNode result in info.SelectNodes("./CRM/result"))
{
    string Key = result.Attributes["key"].Value;
    string Value = result.Attributes["value"].Value;
    .....
    .....
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM