Laden...

Daten aus XML-Datei lesen

10 Antworten
6,205 Aufrufe
Letzter Beitrag: vor 9 Jahren
Daten aus XML-Datei lesen

verwendetes Datenbanksystem: XML
Hallo zusammen,
verushce mich das erste mal an XML und scheitere an der Struktur.
Normlaerweise ist die Struktur ja:

<Buch>
<Autor>
Meier
</Autor>
<Titel>
meinBuch
</Titel>
</Buch>

Das XML das ich lesen muss sieht so aus:

<?xml version="1.0" encoding="UTF-8"?>
-<bom:bomResults xmlns:bom="http://schemas.bla.com/bla/bom/bomtool">
-<bom:mergeOptions>
<bom:partNotInBom enabled="true" handling="replace">NOT_BOM</bom:partNotInBom>
</bom:mergeOptions>
<bom:rules/>
<bom:filteredItems/>
<bom:inputRows/>
-<bom:items>
-<bom:item bom:reference="V353" bom:inputRow="3">
-<bom:fieldValues>
<bom:fieldValue bom:field="1" bom:value="V353"/>
<bom:fieldValue bom:field="2" bom:value="101172350"/>
<bom:fieldValue bom:field="3" bom:value="DB015"/>
<bom:fieldValue bom:field="4" bom:value="SOT-23"/>
</bom:fieldValues>

Ich habe mal etwas rumprobiert, komme aber nicht wirklich weiter, bringe keine Daten raus.


			XmlDocument doc = new XmlDocument();
            doc.Load(outlinePfad + "\\BomOutput.xml");
    	    
            XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
		    manager.AddNamespace("bom","http://schemas.bla.com/bla/bom/bomtool");

			query = "/bom:items/bom:item/bom:item/bom:fieldValues/bom:fieldValue";
			XmlNodeList nodes = doc.SelectNodes(query, manager);
         
			foreach (XmlNode node in nodes)
            {
				MessageBox.Show(node.FirstChild.Value.ToString());
            }

Könnt ihr mir hier weiter helfen?

Danke

gruß
Andreas

Wenn deine Knoten wirklich so aussehen:


-<bom:items>

also mit dem Bindestrich, dann ist das XML, soweit ich sehen kann, nicht valide. Deshalb gehe ich mal davon aus, dass die Bindestriche da nicht sind. Darüber hinaus ist auch der Rest des Dokuments nicht valide.

Fehlermeldung:
(16:19) Critical Unerwartetes Dateiende. Die folgenden Elemente wurden nicht geschlossen: bom:item, bom:items, bom:bomResults. Zeile 16, Position 19.

Wenn du uns kein gültiges XML vorsetzt, können wir dir auch nicht helfen.

EDIT: ich habe das mal, soweit ich das erraten konnte, repariert. Wenn (falls) dein XML so aussieht:


<?xml version="1.0" encoding="UTF-8"?>
<bom:bomResults xmlns:bom="http://schemas.bla.com/bla/bom/bomtool">
    <bom:mergeOptions>
        <bom:partNotInBom enabled="true" handling="replace">NOT_BOM</bom:partNotInBom>
    </bom:mergeOptions>
    <bom:rules />
    <bom:filteredItems />
    <bom:inputRows />
    <bom:items>
        <bom:item bom:reference="V353" bom:inputRow="3">
            <bom:fieldValues>
                <bom:fieldValue bom:field="1" bom:value="V353" />
                <bom:fieldValue bom:field="2" bom:value="101172350" />
                <bom:fieldValue bom:field="3" bom:value="DB015" />
                <bom:fieldValue bom:field="4" bom:value="SOT-23" />
            </bom:fieldValues>
        </bom:item>
    </bom:items>
</bom:bomResults>

, dann sollte deine XPath-Expression auf der Hand liegen. Falls du die fieldValue-Knoten haben willst (was du eigentlich möchtest, hast du ja auch nicht verraten), dann wäre dein XPath natürlich:


/bom:bomResults/bom:items/bom:item/bom:fieldValues/bom:fieldValue

Das ist aber so weit in den absoluten XML-Grundlagen, dass ich dir empfehlen würde, dich noch einmal mit XML, XPath, XSD und Konsorten zu beschäftigen. Ansonsten kannst du dich nur blind vorwärtstasten, und damit ist dir nicht geholfen. Ein sehr guter Startpunkt ist Stefan Münz mit seinem SelfHtml.

LaTino
Danke fürs Nacheditieren, ist wohl noch etwas früh 😉

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

Hallo,

dein Query ist nicht ganz korrekt.

Das Query für den Zugriff auf die Items müsste wie folgt aussehen:


query = "//bom:items/bom:item";

Als weiteres versucht dein Query unter bom:item noch einmal bom:item aufzulösen. Das ist natürlich quatsch, da dort kein weiteres bom:item zu finden ist.

Dein Query insgesamt müsste also wie folgt aussehen:


XmlNodeList nodes = document.SelectNodes("//bom:items/bom:item/bom:fieldValues/bom:fieldValue", manager);

Mal ein komplettes Beispiel in der Konsole:


            XmlDocument document = new XmlDocument();
            document.Load("Test.xml");
            XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable);
            manager.AddNamespace("bom", "http://schemas.unicam.com/unicam/bom/bomtool");

            XmlNodeList nodes = document.SelectNodes("//bom:items/bom:item/bom:fieldValues/bom:fieldValue", manager);

            foreach (XmlNode node in nodes)
            {
                Console.WriteLine(node.Name);
                Console.WriteLine("\t" + "Field: " + node.Attributes["bom:field"].Value);
                Console.WriteLine("\t" + "Value: " + node.Attributes["bom:value"].Value);
            }
            Console.ReadLine();

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

HI LaTino,
sorry, habe jetzt mal einen kleinen Ausschnitt extrahiert:


<?xml version="1.0" encoding="utf-8"?>
<bom:bomResults xmlns:bom="http://schemas.unicam.com/unicam/bom/bomtool">
  <bom:mergeOptions>  
    <bom:partNotInBom handling="replace" enabled="true">
      NOT_BOM
    </bom:partNotInBom>
  </bom:mergeOptions>
  <bom:rules />
  <bom:filteredItems />
  <bom:inputRows />
    <bom:items>
      <bom:item bom:inputRow="3" bom:reference="B2">
        <bom:fieldValues>
          <bom:fieldValue bom:value="B2" bom:field="1" />
          <bom:fieldValue bom:value="10884981" bom:field="2" />
          <bom:fieldValue bom:value="L731-1100A01" bom:field="3" />
          <bom:fieldValue bom:value="QFN-56/8x8" bom:field="4" />
          </bom:fieldValues>
      </bom:item>
    <bom:item bom:inputRow="4" bom:reference="N1">
      <bom:fieldValues><bom:fieldValue bom:value="N1" bom:field="1" />
        <bom:fieldValue bom:value="10302852" bom:field="2" />
        <bom:fieldValue bom:value="LAL0019" bom:field="3" />
        <bom:fieldValue bom:value="SC-70-6" bom:field="4" />
      </bom:fieldValues>
    </bom:item>
  </bom:items>
<bom:fields>
  <bom:field id="1" bom:name="Reference" bom:type="job"/>
  <bom:field id="2" bom:name="Part Number" bom:type="job"/>
  <bom:field id="3" bom:name="Comment" bom:type="job"/>
  <bom:field id="4" bom:name="Asm. shape" bom:type="job"/>
</bom:fields>
</bom:bomResults>

Gruß
Andreas

Hinweis von Coffeebean vor 9 Jahren

Bitte benutze die richtigen Code-Tags [Hinweis] Wie poste ich richtig? Punkt 6

hi inflames2k,
perfekt, das funzt ja schon.
Vielen Dank, da kann ich jetzt drauf aufbauen und vorallem verstehen 😃

Vielen Dank

Gruß
Andreas

Ja, dann ist der XPath von inflames2k und mir richtig (sind zwar nicht identisch, aber inhaltlich gleich).

Da das ein relativ simpler Ausdruck ist (eigentlich sogar der simpelste XPath, den es so gibt), gilt der Hinweis auf die Grundlagen immer noch. Schau dir mal den Link oben genauer an.

Für Anfänger häufig einfacher ist auch die Herangehensweise mit Linq2Xml statt mit XmlDocument:


XDocument myDoc = XDocument.Load(outlinePfad + "\\BomOutput.xml");
var nspace = myDoc.Root.GetDefaultNamespace();
var fieldValueNodes = myDoc.Root.Descendants(nspace + "fieldValue");

Damit spart man sich zwar XPath - heisst aber nicht, dass man XPath nicht kennen muss.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

Hallo jetzt habe ich doch noch eine Frage...
ich durchlaufe die Knoten Items, der Inhalt dieser Knoten steck in FieldValues/fieldValue.
So durchlaufe ich die items:


             XmlDocument document = new XmlDocument();
             document.Load(outlinePfad + "\\BomOutput.xml");
             XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable);
             manager.AddNamespace("bom", "http://schemas.unicam.com/unicam/bom/bomtool");

             XmlNodeList nodes = document.SelectNodes("//bom:items/bom:item", manager);

             foreach (XmlNode node in nodes)
             {
                 MessageBox.Show(node.Attributes["bom:reference"].Value);
             }



Wie komme ich in der Schleife jetzt an die Values?

Damit spart man sich zwar XPath - heisst aber nicht, dass man XPath nicht kennen muss.

Ich habe die schlimme befürchtung, dass er mit XPath rumopertiert, weil er das ganze in eine Objektstruktur bringen muss (ist zwar nicht schwer aber für einen Anfänger..).

Gerade bei Sachen wie das auflösen der Felddefinitionen gegen die einzelnen Feldvalues könnte ich mir bei ihm schwierig vorstellen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |