【问题标题】:Get xml element with specific attribute value in XmlDocument在 XmlDocument 中获取具有特定属性值的 xml 元素
【发布时间】:2015-11-28 15:03:32
【问题描述】:

基于以下 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,我如何获取&lt;CfgGroup&gt;元素(指的是agentDBIDs/DBID值,而不是CfgGroup/DBID值)?

有什么建议吗?

【问题讨论】:

    标签: c# .net xml xmldocument


    【解决方案1】:

    您可以使用SelectNodes() 传递以下XPath 作为参数,从XmlDocument 中提取对应agentDBIDs/DBID/@value 等于103CfgGroup 元素:

    /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);
    }
    

    Dotnetfiddle Demo

    输出:

    <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>
    

    【讨论】:

    • 嗨@har07,感谢您的解决方案,它解决了我的问题。
    【解决方案2】:

    如果我正确理解了您的问题,应该这样做

    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"));
    

    【讨论】:

      【解决方案3】:

      试试这个

      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");
              }
          }
      }
      ​
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-16
        • 1970-01-01
        • 2012-03-03
        • 1970-01-01
        • 1970-01-01
        • 2023-01-19
        • 2013-02-04
        • 2021-05-24
        相关资源
        最近更新 更多