Laden...

Wie kann ich eine XML-Datei auslesen?

Erstellt von Kaladial vor 3 Jahren Letzter Beitrag vor 3 Jahren 861 Views
K
Kaladial Themenstarter:in
54 Beiträge seit 2017
vor 3 Jahren
Wie kann ich eine XML-Datei auslesen?

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

16.807 Beiträge seit 2008
vor 3 Jahren

par ist hier einfach nur ein XML Element.

XML Element
Google-Suche nach c# xml tutorial

Grundlagen Tutorial zu XML:
XML Documents and Data

T
2.219 Beiträge seit 2008
vor 3 Jahren

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.

K
Kaladial Themenstarter:in
54 Beiträge seit 2017
vor 3 Jahren

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."}

16.807 Beiträge seit 2008
vor 3 Jahren

Siehe Code Beispiel in der Dokumentation:
C# XmlDocument Class

Du musst nur den XPath setzen.
Select Nodes Using XPath Navigation

K
Kaladial Themenstarter:in
54 Beiträge seit 2017
vor 3 Jahren

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 ...

16.807 Beiträge seit 2008
vor 3 Jahren

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:

  • Beispiel XML
  • Beispiel Path

Du musst das dann nur noch auf Dein XML übertragen.

K
Kaladial Themenstarter:in
54 Beiträge seit 2017
vor 3 Jahren

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

K
Kaladial Themenstarter:in
54 Beiträge seit 2017
vor 3 Jahren

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;
            }

5.657 Beiträge seit 2006
vor 3 Jahren

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

16.807 Beiträge seit 2008
vor 3 Jahren

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!

K
Kaladial Themenstarter:in
54 Beiträge seit 2017
vor 3 Jahren

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."}

da stehen doch wohl 2 fragen drin...

12 Beiträge seit 2020
vor 3 Jahren

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"