2016-04-27 18 views
0

Ich brauche die Anzahl der EmpList Tag insbesondere <EmpTypeHeader> und <EID>.C# XML Element Count in XML Knoten

Zum Beispiel zu bekommen:

EID - 9991515720640 with 1st EmpTypeHeader(XML Node) tag Contains 2 EmpList Tag 
EID - 4534545454534 with 2nd EmpTypeHeader(XML Node) tag Contains 1 EmpList Tag 
EID - 8998653323 with 3rd EmpTypeHeader(XML Node) tag Contains 1 EmpList Tag 

Aber wenn ich EMPList Tag Zahl auswählen zeigt es insgesamt Count von 4.

Meine XML:

<Employee> 
    <EmployeeHeader> 
     <Date>2016-01-07</Date> 
     <Time>03:45:39</Time> 
    </EmployeeHeader> 
    <EmpTypeHeader> 
     <EID>9991515720640</EID> 
     <AAA>4</AAA> 
     <BBB /> 
     <EmpList> 
      <CCC>222</CCC> 
      <DDD>3333</DDD> 
      <EEE>2050-09-25</EEE> 
      <FFF>000</FFF> 
     </EmpList>  
     <EmpList> 
      <CCC>555</CCC> 
      <DDD>666</DDD> 
      <EEE>2050-09-25</EEE> 
      <FFF>000</FFF> 
     </EmpList> 
    </EmpTypeHeader> 
    <EmpTypeHeader> 
     <EID>4534545454534</EID> 
     <AAA>66</AAA> 
     <BBB /> 
     <EmpList> 
      <CCC>999</CCC> 
      <DDD>008</DDD> 
      <EEE>2050-09-25</EEE> 
      <FFF>000</FFF> 
     </EmpList>  
    </EmpTypeHeader> 
    <EmpTypeHeader> 
     <EID>8998653323</EID> 
     <AAA>9999</AAA> 
     <BBB /> 
     <EmpList> 
      <CCC>11333334</CCC> 
      <DDD>663312</DDD> 
      <EEE>2050-09-25</EEE> 
      <FFF>000</FFF> 
     </EmpList>  
    </EmpTypeHeader> 
</Employee> 
mein Code

Und:

private void ReadXMLEmp() 
{ 
    string eid = "9991515720640"; 
    string strFileName = @"D:\Raseeth\Test1.xml"; 
    xmlDocument = new XmlDocument(); 

    xmlDocument.Load(strFileName); 
    xmlNodeListEmpTypeHeader = xmlDocument.SelectNodes("//EmpTypeHeader");      
    if (xmlNodeListEmpTypeHeader != null) 
    { 
     int empListCount = 0; 

     foreach (XmlNode xmlNodeEmpTypeHeader in xmlNodeListEmpTypeHeader) 
     { 
      if (xmlNodeEmpTypeHeader["EID"] != null && xmlNodeEmpTypeHeader["EID"].InnerText.Trim() == eid) 
      { 
       empListCount = xmlNodeEmpTypeHeader.SelectNodes("//Position").Count; 
       Console.WriteLine("EmpList Count : " + empListCount); 
       bFlag = true; 
       break; 
      } 
     } 
    } 
} 
+0

Nie, ich war blind es scheint etwas dagegen. (gelöschter vorheriger Kommentar) – CherryDT

Antwort

0

Das Problem ist Ihr XPath-Ausdruck. //Position findet alle Knoten im Dokument mit diesem Namen, während Sie nur an Nachkommen des aktuellen Knotens interessiert sind.

Ändern Sie diesen Wert zu .//Position - der . bezieht sich auf den aktuellen Knotenkontext.

Nachdem dies gesagt ist, LINQ to XML eine weit sauberere Lösung ist, die XPath und der alte XmlDocument API, zum Beispiel:

var count = XDocument.Load("path/to/file.xml") 
    .Descendants("EmpTypeHeader") 
    .Where(x => (string) x.Element("EID") == "9991515720640") 
    .Descendants("Position") 
    .Count(); 
+0

Ich habe Ergebnis ... vielen Dank – Raseeth

0

Wenn Sie .Net 3,5

XElement root = XElement.Load(strFileName); 
int total = 0; 
foreach(var eid in root.Descendants("EID").ToList()) 
{ 
    int count = eid.Parent.Elements("EmpList").Count(); 
    Console.WriteLine(eid.Value + " " + count.ToString()); 
    total += count; 
} 
Console.WriteLine("Total EmpList's: " + total.ToString()); 

verstehe ich nicht wirklich die Frage verwenden können. Wollte Sie eine Gesamtzahl von EmpLists oder eine Anzahl von EmpLists durch EID haben? Ich habe beides gemacht.

+0

Ich habe Ergebnis ... vielen Dank – Raseeth