簡體   English   中英

如何使用linq或xpath查詢xml

[英]how to query xml using linq or 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>

試試這個代碼:

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

您可以這樣嘗試:

.....
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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM