Hallo zusammen,
ich komm grad nicht weiter.
Ich habe eine XML bekommen die Inhalte enthält die ich so noch nicht kannte.
Wie kann ich so eine XML auslesen ?
<?xml version="1.0" encoding="UTF-8"?>
<order Version="1.0">
<par name="ppo">245571_2007617_1</par>
<par name="lotNumber">2007617</par>
<par name="expirationDate">10/31/2023 00:00:00</par>
<par name="productionDate">10/31/2020 00:00:00</par>
<level name="B">
<par name="gtin">06221032240842</par>
<par name="sgtinSerial">
<el>200761710100012</el>
<el>200761710100019</el>
<el>200761710100102</el>
<el>200761710100184</el>
<el>200761710100215</el>
<el>200761710999957</el>
</par>
<par name="levelQty">11500</par>
</level>
</order>
Ich versteh nicht was dieses par da spll.
Danke für die Hilfe
mfg Kala
par ist hier einfach nur ein XML Element.
XML Element
Google-Suche nach c# xml tutorial
Grundlagen Tutorial zu XML:
XML Documents and Data
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
par klingt für mich nach Parameter und soll hier einen dynamischen Datenwert abbilden.
Du müsstest du Xml parsen und die Elemente dann entsprechend über das name Atribut mappen.
Entweder per XDocument oder per XmlReader.
Je nachdem wie groß die Xml Dateien sein können, wäre ein eigener Parser über einen XmlReader sinnvoll.
Im einfachsten Fall einfach per XDocument die Tags und Atribute auslesen und manuell mappen.
Ggf. kannst du auch mit richtigen Einstellungen einfach ein Objekt aus dem Xml deserialisieren lassen.
Müsste aber selbst erst schauen, ob dies so ohne weiteres machbar wäre.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
aber wie les ich das aus ?
ich hatte überlegt das mit der variante zu machen:
XmlDocument xml = new XmlDocument();
xml.LoadXml(xml_filemname);
XmlNodeList xnList = xml.SelectNodes("???");
foreach (XmlNode xn in xnList)
{
string ppo = xn["ppo"].InnerText;
}
aber was muss ich da bei ??? eingaben?
mal davon abgesehn das das auch nicht ging
xml.LoadXml(xml_filemname); schmeisst ne exception
{"Ungültige Daten auf Stammebene. Zeile 1, Position 1."}
Siehe Code Beispiel in der Dokumentation:
C# XmlDocument Class
Du musst nur den XPath setzen.
Select Nodes Using XPath Navigation
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
sorry aber die links bringen mir nicht wirklich was ...
kannst du mir an hand von nem kleinen beispiel das net mal erklären ?
ich schreib ja auch was ich bisher gemacht hab ...
Der Sinn ist ja der, dass Du lernst, wie der XPath funktioniert.
Wenn ich Dir jetzt die Lösung schreibe, dann lernst Du es ja nicht - sondern kopierst nur.
Die Links zeigen exakt, wie man den XPath baut:
Du musst das dann nur noch auf Dein XML übertragen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
habs selber raus gefunden
sinnvoller wäre aber der hinweis, das zum einen Load nicht LoadXML benutzt werden muss
und 2. das die Pfade immer die 1. elemente in dem xml sind
also das ich /order/par
oder /order/level/par/el schreiben muss um an die inhalte ran zu kommen und das die als "name"
beschriebenen elemente überhaupt keine wirkung haben und man sie nur im outer text findet...
das wären sinnvolle hilfen gewesen
ich habs jetzt so:
try
{
xmlF = new XMLFile();
string ppo = "";
string lotNumber = "";
string expirationDate = "";
string productionDate = "";
XmlDocument xml = new XmlDocument();
xml.Load(xml_filemname);
XmlNodeList xnList = xml.SelectNodes("/order/par");
foreach (XmlNode xn in xnList)
{
if (xn.OuterXml.Contains("ppo"))
{
ppo = xn.InnerText;
}
if (xn.OuterXml.Contains("lotNumber"))
{
lotNumber = xn.InnerText;
}
if (xn.OuterXml.Contains("expirationDate"))
{
expirationDate = xn.InnerText;
}
if (xn.OuterXml.Contains("productionDate"))
{
productionDate = xn.InnerText;
}
}
string gtin = "";
string levelQty = "";
List<string> sgtinSerial = new List<string>();
xnList = xml.SelectNodes("/order/level/par");
foreach (XmlNode xn in xnList)
{
if (xn.OuterXml.Contains("gtin"))
{
gtin = xn.InnerText;
}
if (xn.OuterXml.Contains("levelQty"))
{
levelQty = xn.InnerText;
}
if (xn.OuterXml.Contains("sgtinSerial"))
{
//sgtinSerial = xn.InnerText;
}
}
xnList = xml.SelectNodes("/order/level/par/el");
foreach (XmlNode xn in xnList)
{
sgtinSerial.Add(xn.InnerText);
}
xmlF.ppo = ppo;
xmlF.gtin = gtin;
xmlF.lotNumber = lotNumber;
xmlF.expirationDate = expirationDate;
xmlF.productionDate = productionDate;
xmlF.countSN = levelQty;
xmlF.sgtinSerial = sgtinSerial;
}
catch (Exception ex)
{
string e = ex.Message;
}
Also wenn du dich so komplett weigerst, mal in die Doku zu schauen, wird das auf Dauer nichts.
Wenn ein Fehler oder unerklärliches Verhalten auftritt, ist die Doku der erste Anlaufpunkt. Dann hättest du auch gesehen, daß die XmlDocument.LoadXml-Methode keinen Pfad erwartet, sondern XML.
Und daß es mehrere Beispiele in der Doku gibt, wie man XML-Dateien auslesen kann.
Bitte beachte [Hinweis] Wie poste ich richtig?, besonders Punkt 1.
Und: [Tipp] Schau in die Doku! - Möglichkeiten der Informationsgewinnung
Weeks of programming can save you hours of planning
das wären sinnvolle hilfen gewesen
..bei solchen Aussagen brauchst Du Dich nicht wundern, wenn Du in Zukunft keine Hilfe mehr bekommst - zurecht.
Du hast mit den Fragezeichen nach dem XPath gefragt; kommst nun aber mit was völlig anderem, mit den Load um die Ecke. Zwei Dinge, die nichts, aber auch wirklich gar nichts miteinander zutun haben.
Die Leute hier verwenden ihre Freizeit um Dir zu helfen. Wenn dann doofe (oder dumme) Sprüche kommen, dann biste einfach falsch am Platz.
Ansonsten hast Du evtl ein Forum, das eine Hilfestellung bietet, mit einem Code-Hiwi verwechselt, der Dir auf Zuruf den Code fixt.
Viel Erfolg!
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
aber wie les ich das aus ?
ich hatte überlegt das mit der variante zu machen:
XmlDocument xml = new XmlDocument(); xml.LoadXml(xml_filemname); XmlNodeList xnList = xml.SelectNodes("???"); foreach (XmlNode xn in xnList) { string ppo = xn["ppo"].InnerText; }
aber was muss ich da bei ??? eingaben?
mal davon abgesehn das das auch nicht gingxml.LoadXml(xml_filemname); schmeisst ne exception
{"Ungültige Daten auf Stammebene. Zeile 1, Position 1."}
da stehen doch wohl 2 fragen drin...
Hi,
aber was muss ich da bei ??? eingaben?
XmlNodeList nodes = xDoc.SelectNodes("//element[@name='value1']");
Das im "" ist also eben der XPath Befehl wo man jetzt das Dokument nach Knotenname "element" durchsucht das den Attribut "name" hat mit dem Wert "value1".
Da ich nicht weiß was du genau für Elemente suchst wären hier Beispiele zu XPath bei dem verschiedenes durchgespielt wird. Ich denk das du dann den Inhalt für ??? findest.
Beispiele XPath
Bzw. "." XPath-Erklärung für "ab dem Knoten suchen"