2016-08-05 47 views
0

Dies ist mein Code:GetElementsByTagName bekommt nur den ersten Knoten (XMLDocument)

FileInfo[] Files = difo.GetFiles("*.xml");    
     string[] parts; 
     string[] FileSearchRes = Directory.GetFiles(@"C:\Users\ahodhv\Perforce\ahodhv_RD0029717_1921\prod\delivery\q_rec\int_test\SOPS", "*.xml", SearchOption.AllDirectories); 
     int i = 0; 
     foreach (FileInfo File in Files) 

     { 
      parts = File.Name.Split('_');            
      boxvehicles.Items.Add(parts[0]); 
      string test = FileSearchRes[i]; 
      doc.Load(FileSearchRes[i]); 
      List<string> name = new List<string>(); 
      var accountNodes = doc.GetElementsByTagName("FpcBlock"); 
      for (int j = 0; j < accountNodes.Count; j++) 
      { 
       var account = accountNodes[j].SelectSingleNode("./FPC"); 
       if (account != null && account.Attributes != null) 
       { 
        // Read node attribute 
        name.Add(account.Attributes["Name"].Value + account.Attributes["Value"].Value); 
       } 
      } 
       i++;    
     } 

Im Versuch, aus einer XML-Datei zu lesen, die wie folgt aussieht:

<FpcBlock Version="01"> 
     <FPC Name="1" Value="A" Updated="false" /> 
     <FPC Name="3" Value="B" Updated="false" /> 
     <FPC Name="5" Value="B" Updated="false" /> 
     <FPC Name="8" Value="B" Updated="false" /> 
     <FPC Name="10" Value="B" Updated="false" /> 
</FpcBlock> 

Das Problem in der Linie liegt :

var accountNodes = doc.GetElementsByTagName("FpcBlock"); 

accountnodes hat count 1 was falsch ist, da ich mehr Knoten habe. Aus diesem Grund wird nur der erste Knoten zum Namen hinzugefügt. Was mache ich falsch?

EDIT: Sorry, wenn ich verwirrt war. Ich möchte alle darunter liegenden Zeilen in einer Liste speichern. Was ich wünsche ist, dass die Liste sollte etwa so aussehen:

und so weiter. Also speichere ich den Namen und den Wert. Aber im Moment bekomme ich nur die erste Reihe, die 1A ist.

EDIT nr 2: Ich missverstanden die GetElementsByTagName() Methode. Durch den Wechsel zu GetElementsByTagName("FPC") sollte es das Problem geben.

+0

Ihr XML hat * nur ein * 'FpcBlock' Element. Es ist nicht klar, warum du denkst, du solltest mehr als einen bekommen, wenn es nur einen gibt. Ist Ihr Beispiel unvollständig? –

+0

Scheint, als wäre ich ein bisschen verwirrend sorry. Ich hätte gerne alles unter geschrieben. Also würde ich gerne alle 5 Zeilen darunter –

+0

Dann warum nicht 'GetElementsByTagName (" FPC ")', da sie diejenigen sind, die Sie eigentlich wollen? –

Antwort

0

Sie suchen nach Elementen mit dem Namen FpcBlock, scheinen aber Elemente mit der Bezeichnung FPC zu erwarten. Wenn Sie nach den Elementen suchen, die Sie eigentlich suchen, werden Sie wahrscheinlich feststellen, dass das Problem verschwindet.

Das heißt, LINQ to XML ist eine viel modernere, sauberere API als die alte API XmlDocument. Es wäre damit viel schöner zu arbeiten sein:

var nameValues = 
    from fpc in doc.Descendants("FPC") 
    select new 
    { 
     Name = (int) fpc.Attribute("Name"), 
     Value = (string) fpc.Attribute("Value") 
    }; 

Siehe this fiddle für eine funktionierende Demo.

+0

Vielen Dank. Ich habe das versucht und es hat funktioniert wie ein Zauber. Ich werde deine Hilfe als Antwort markieren. –