在 XmlDocument 中获取具有特定属性值的 xml 元素
Get xml element with specific attribute value in XmlDocument
基于下面的XML:
<?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>
如果属性值为 103(指的是 agentDBIDs/DBID
值,而不是 CfgGroup/DBID
值),如何获取 <CfgGroup>
元素?
有什么建议吗?
如果我正确理解你的问题,这应该可以
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"));
试试这个
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");
}
}
}
您可以使用 SelectNodes()
传递以下 XPath 作为参数,从 XmlDocument
中提取 CfgGroup
个元素,其中对应的 agentDBIDs/DBID/@value
等于 103
:
/ConfData/CfgAgentGroup[agentDBIDs/DBID/@value=103]/CfgGroup
工作演示示例:
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);
}
输出:
<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>
基于下面的XML:
<?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>
如果属性值为 103(指的是 agentDBIDs/DBID
值,而不是 CfgGroup/DBID
值),如何获取 <CfgGroup>
元素?
有什么建议吗?
如果我正确理解你的问题,这应该可以
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"));
试试这个
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");
}
}
}
您可以使用 SelectNodes()
传递以下 XPath 作为参数,从 XmlDocument
中提取 CfgGroup
个元素,其中对应的 agentDBIDs/DBID/@value
等于 103
:
/ConfData/CfgAgentGroup[agentDBIDs/DBID/@value=103]/CfgGroup
工作演示示例:
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);
}
输出:
<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>