如何仅循环访问与特定名称 (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>

如何仅循环访问与特定名称 (XmlDocument) 匹配的子节点

目前还不完全清楚您的xml是什么样子的,但是我想您有名称为service1service2等的服务节点。您可以使用正则表达式来测试节点名称是否与服务类型匹配(如果 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
    }
}