YWah
YWah

Reputation: 579

Get xml element with specific attribute value in XmlDocument

Based on the XML below:

<?xml version="1.0" encoding="Windows-1252"?>
<ConfData>
   <CfgAgentGroup>
    <CfgGroup>
      <DBID value="109" />
      <tenantDBID value="1" />
      <name value="group1" />
      <contractDBID value="0" />
    </CfgGroup>
    <agentDBIDs>
      <DBID value="103" />
      <DBID value="994" />
    </agentDBIDs>
  </CfgAgentGroup>
  <CfgAgentGroup>
    <CfgGroup>
      <DBID value="110" />
      <tenantDBID value="1" />
      <name value="group2" />     
      <contractDBID value="0" />
    </CfgGroup>
    <agentDBIDs>
      <DBID value="102" />
      <DBID value="103" />         
      <DBID value="1019" />
      <DBID value="1020" />
    </agentDBIDs>
  </CfgAgentGroup>
</ConfData>

How can I get the <CfgGroup> element if the attribute value is 103 (referring to agentDBIDs/DBID value, NOT CfgGroup/DBID value)?

Any suggestions?

Upvotes: 0

Views: 679

Answers (3)

har07
har07

Reputation: 89295

You can use SelectNodes() passing the following XPath as parameter to pull out CfgGroup elements where the corresponding agentDBIDs/DBID/@value equals 103, from an XmlDocument :

/ConfData/CfgAgentGroup[agentDBIDs/DBID/@value=103]/CfgGroup

working demo example :

var xml = @"<ConfData>
   <CfgAgentGroup>
    <CfgGroup>
      <DBID value='109' />
      <tenantDBID value='1' />
      <name value='group1' />
      <contractDBID value='0' />
    </CfgGroup>
    <agentDBIDs>
      <DBID value='103' />
      <DBID value='994' />
    </agentDBIDs>
  </CfgAgentGroup>
  <CfgAgentGroup>
    <CfgGroup>
      <DBID value='110' />
      <tenantDBID value='1' />
      <name value='group2' />     
      <contractDBID value='0' />
    </CfgGroup>
    <agentDBIDs>
      <DBID value='102' />
      <DBID value='103' />         
      <DBID value='1019' />
      <DBID value='1020' />
    </agentDBIDs>
  </CfgAgentGroup>
</ConfData>";
var doc = new XmlDocument();
doc.LoadXml(xml);
var result = doc.DocumentElement.SelectNodes("/ConfData/CfgAgentGroup[agentDBIDs/DBID/@value=103]/CfgGroup");

foreach(XmlNode r in result)
{
    Console.WriteLine(r.OuterXml);
}

Dotnetfiddle Demo

output :

<CfgGroup><DBID value="109" /><tenantDBID value="1" /><name value="group1" /><contractDBID value="0" /></CfgGroup>
<CfgGroup><DBID value="110" /><tenantDBID value="1" /><name value="group2" /><contractDBID value="0" /></CfgGroup>

Upvotes: 1

jdweng
jdweng

Reputation: 34419

Try this

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XElement CfgAgentGroup = doc.Descendants("CfgAgentGroup").Where(x => (int)x.Element("agentDBIDs").Element("DBID").Attribute("value") == 103).FirstOrDefault();
            XElement cfgGroup = CfgAgentGroup.Element("CfgGroup");
        }
    }
}
​

Upvotes: 0

Arghya C
Arghya C

Reputation: 10068

If I understood your question correctly, this should do

var xDoc = XDocument.Parse(File.ReadAllText(@"C:\YourDirectory\sample.xml"));

var cfgAgentGroups = xDoc.Descendants("CfgAgentGroup");
var cfgGroups = cfgAgentGroups
                .Where(n => n.Element("agentDBIDs")
                                .Elements("DBID")
                                .Any(dbid => dbid.Attribute("value").Value == "103"))
                .Select(cag => cag.Element("CfgGroup"));

Upvotes: 0

Related Questions