2017-07-18 5 views
1

Ich verwende HTMLAgilityPack zum Lesen und Laden einer XML-Datei. Nachdem die Datei geladen ist, möchte ich die Werte daraus in eine Datenbank einfügen.C# Xpath gibt nur das erste Element zurück

XML sieht wie folgt aus:

<meeting> 
     <jobname></jobname> 
     <jobexperience></jobexperience> 
</meeting> 

Ich versuche, dies mit XPath-Anweisungen innerhalb einer foreach-Schleife zu erreichen wie hier zu sehen:

DataTable dt = new DataTable(); 
//Add Data Columns here 
dt.Columns.Add("JobName"); 
dt.Columns.Add("JobExperience"); 

// Create a string to read the XML tag "job" 
string xPath_job = "//job"; 
string xPath_job_experience = "//jobexperience"; 


/* Use a ForEach loop to go through all 'meeting' tags and get the values 
    from the 'JobName' and 'JobExperience' tags */ 

foreach (HtmlNode planned_meeting in doc.DocumentNode.SelectNodes("//meeting")) 
{ 
    DataRow dr = dt.NewRow(); 

    dr["JobName"] = planned_meeting.SelectSingleNode(xPath_job).InnerText; 

    dr["JobName"] = planned_meeting.SelectSingleNode(xPath_job_experience).InnerText; 

    dt.Rows.Add(dr); 

}  

Das Problem ist also, dass, obwohl die foreach Die Schleife durchläuft alle Besprechungstags, sie ruft nur die Werte der ersten Besprechung ab.

Jede Hilfe würde sehr geschätzt werden!

+3

Ich denke, Ihre XPath-Abfragen sollten nur sein 'Jobname 'und' jobexperience', ohne die Schrägstriche. –

+1

Yup xPath_ * -Variablen dürfen keine Schrägstriche enthalten. – StuartLC

+0

Siehe [diese handliche Seite] (https://www.w3schools.com/xml/xpath_syntax.asp) für einen XPath-Spickzettel. –

Antwort

2

Also das Problem ist, dass, obwohl die foreach-Schleife jeden Tag "Besprechung" durchläuft, es die Werte nur von der ersten "Besprechung" -Tag bekommt.

Ja, das ist der Code. Die XPath operator // wählt alle die Elemente in dem gesamten Dokument, z.B. //job Wählen Sie allejob Elemente im gesamten Dokument.

Also in Ihrer foreach-Schleife Sie wählen alle meeting Elemente in dem gesamten Dokument mit

doc.DocumentNode.SelectNodes("//meeting")) 

und dann - in der Schleife - Sie wählen alle //job und alle //jobexperience Elemente in dem gesamten Dokument mit

string xPath_job = "//job"; 
string xPath_job_experience = "//jobexperience"; 

So wählen Sie das erste Element von alle Elemente - immer und immer wieder ... Daher der Eindruck, dass Sie nur das erste Element bekommen.


Also den Code in einer Art und Weise ändern, dass die Kinder des aktuellenmeeting Elements ausgewählt bekommen (durch den // Operator zu entfernen):

string xPath_job   = "job"; 
string xPath_job_experience = "jobexperience"; 
Verwandte Themen