如何仅循环访问与特定名称 (XmlDocument) 匹配的子节点
本文关键字:XmlDocument 子节点 定名称 循环 何仅 访问 | 更新日期: 2023-09-27 18:30:50
>我有以下嵌套循环
foreach (XmlNode nodeT in root.ChildNodes)
{
foreach (XmlNode nodeServicio in nodeT.ChildNodes)
{
nombreMayusculas = nodeServicio.Name.ToUpper();
if (nombreMayusculas.Contains("SERVICE"))
{
int a = 0;
int.TryParse(nombreMayusculas.Replace("SERVICE", ""), out a);
if (a.Equals(Type))
{
//some logic here to process only the matching Xmlnode
}
}
}
}
编辑有没有办法只循环满足两个条件的匹配的XmlNode?
我尝试使用 Where
linq 方法,但不可用,我已经有了using System.Linq
这是 XML
<Clients>
<AgoraCOR1 Type='"SP'" Default='"False'">
<Connectionstring>CONN_STRING</Connectionstring>
<Service002>SaveOperationNotification</Service002>
<Service106>SaveOrderNotification</Service106>
</AgoraCOR1>
<SerficorpOrdenes1 Type='"SP'" Default='"False'">
<Connectionstring>CONN_STRING</Connectionstring>
<Service106>SaveOrderNotification</Service106>
<Service017>SaveComplementationNotification</Service017>
</SerficorpOrdenes1>
<CorrevalCORInterno1 Type='"SP'" Default='"False'">
<Connectionstring>CONN_STRING</Connectionstring>
<Service002>SaveOperationNotification</Service002>
<Service074>SaveIndicatorNotification</Service074>
<Service106>SaveOrderNotification</Service106>
<Service017>SaveComplementationNotification</Service017>
<Service072>SalvarNotificacionPreciosDeMercado</Service072>
</CorrevalCORInterno1>
</Clients>
目前还不完全清楚您的xml是什么样子的,但是我想您有名称为service1,service2等的服务节点。您可以使用正则表达式来测试节点名称是否与服务类型匹配(如果 xml 结构不同,您可以更改模式):
var xdoc = XDocument.Load(path_to_xml);
Regex regex = new Regex(String.Format("^Service{0}$", Type));
var services = from s in xdoc.Root.Elements().Elements()
where regex.IsMatch(s.Name.LocalName)
select s;
使用 XPath
的替代解决方案(您应该添加 System.Xml.XPath)命名空间:
var xpath = String.Format("Clients/*/*[name() = 'Service{0}']", Type);
var services = xdoc.XPathSelectElements(xpath);
与旧的 XmlDocument 类相同的解决方案:
XmlDocument doc = new XmlDocument();
doc.Load(path_to_xml);
foreach(XmlNode nodeServicio in doc.SelectNodes(xpath)) // xpath same as above
// use nodeServicio
您可以使用 Linq - 但它将具有与您已经完成的操作相同的性能配置文件:
var nodesToProcess = root
.ChildNodes
.ChildNodes
.Where(n => n.Name.ToUpper().Contains("SERVICE")));
foreach(var node in nodesToProcess)
{
....
}
第二个循环可以重写如下。
var result = from nodeServicio in nodeT.ChildNodes
where nodeServicio.Name.ToUpper().Contains("SERVICE")
select nodeServicio;//or something else
编辑:
从您发布的代码中。我猜子节点的值看起来像 SERVICE123、12SERVICE 等
int type = 5; //integer
if (nombreMayusculas.Contains("SERVICE"))
{
int a = 0;
int.TryParse(nombreMayusculas.Replace("SERVICE", ""), out a);
//You cannot use Equals here.. used only for string comparison
if (a == type))
{
//some logic here to process only the matching Xmlnode
}
}