如何使用linq或xpath查询xml

时间:2014-07-01 08:49:17

标签: c# xml linq xpath

在下面的xml中,我想通过matricule查询xml,然后遍历HO elements并将它们插入到.net列表中。

我尝试了以下代码,但它不起作用:

private List<Habilitation> GetAgents(string matricule)
 {
 List<Habilitation> haList = new List<Habilitation>();   

 IEnumerable<XElement> list = xdoc.XPathSelectElements("//agents/agent/data[matricule=matricule"]);
                foreach (XElement ho in list)
                {
                    Habilitation ha = new Habilitation();
                    ha.Matricule = (string)ho.Element("matricule");
                    ha.H_Domain = (string)ho.Parent.Element("questions").Element("H0").Element("H_Domain");
                    ha.H_Environment = (string)ho.Parent.Element("questions").Element("H0").Element("H_Environment");
                    ha.H_Mastered = (string)ho.Parent.Element("questions").Element("H0").Element("H_Mastered");
                    haList.Add(ha);
                }


                return haList;
                }

XML

<agents xmlns="">
    <agent>
      <data>
        <name>Agent1</name>
        <matricule>123456</matricule>
      </data>
      <questions>
        <H0>
          <H_Domain>RAC Raccordement Basse Tension12</H_Domain>
          <H_Environment>CPT travaux comptage12</H_Environment>
          <H_Mastered>0</H_Mastered>
        </H0>
        <H0>
          <H_Domain>IBT Intervention r�seau Basse Tension</H_Domain>
          <H_Environment>TIA Travaux aux installations a�riennes</H_Environment>
          <H_Mastered>1</H_Mastered>
        </H0>
        <H0>
          <H_Domain>IBT Intervention r�seau Basse Tension</H_Domain>
          <H_Environment>AEM Actes d'exploitation et man�uvre</H_Environment>
          <H_Mastered>1</H_Mastered>
        </H0>
      </questions>
    </agent>
    <agent>
      <data>
        <name>Agent2</name>
        <matricule>1234567</matricule>
      </data>
      <questions>
        <H0>
          <H_Domain>HTS Haute Tension Souterraine11111111555</H_Domain>
          <H_Environment>AEM Actes d'exploitation et man�uvre</H_Environment>
          <H_Mastered>1</H_Mastered>
        </H0>
      </questions>
    </agent>
    <agent>
      <data>
        <name>Agent3</name>
        <matricule>1234568</matricule>
      </data>
      <questions>
        <H0>
          <H_Domain>IBT Intervention r�seau Basse Tension</H_Domain>
          <H_Environment>TIA Travaux aux installations a�riennes</H_Environment>
          <H_Mastered>0</H_Mastered>
        </H0>
      </questions>
    </agent>
  </agents>

2 个答案:

答案 0 :(得分:0)

试试这段代码:

var node = doc.Descendants("agent").Elements("questions").Elements("H0");

答案 1 :(得分:0)

您可以尝试这种方式:

.....
var xpath = String.Format("//agents/agent[data/matricule='{0}']/questions/H0", matricule);
IEnumerable<XElement> list = xdoc.XPathSelectElements(xpath);
foreach (XElement ho in list)
{
    Habilitation ha = new Habilitation();
    ha.Matricule = matricule;
    ha.H_Domain = (string)ho.Element("H_Domain");
    ha.H_Environment = (string)ho.Element("H_Environment");
    ha.H_Mastered = (string)ho.Element("H_Mastered");
    haList.Add(ha);
}
.....

或使用LINQ创建List<Habilitation>替换foreach

var haList = (from ho in xdoc.XPathSelectElements(xpath);
              select select new Habilitation
                             {
                                 Matricule = matricule,
                                 H_Domain = (string)ho.Element("H_Domain"),
                                 H_Environment = (string)ho.Element("H_Environment"),
                                 H_Mastered = (string)ho.Element("H_Mastered")
                             }).ToList();