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 😉
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();
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
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
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.
Hallo allgaeu73,
XML-Dateien lesen ist ein Standard"problem", was auch hier im Forum schon zig mal behandelt wurde.
Richtiges Auslesen einer XML - Verschiedene Schemas
XML-Datei lesen und wieder in ein Objekt speichern
XML lesen in der Hierarchie
Effizientes lesen von Konfigurationswerten aus XML
XML deserialisieren
[gelöst] XML aus einem Stream lesen
XML lesen und an ListBox binden
XML Knoten lesen
XML dynamisch auslesen
Xml Dateien values auslesen
XML Datei lesen und als integer Variable speichern.
Daten aus XML-Datei und aus Datenbank einlesen (und abgleichen)
Kml (Xml) Datei auslesen mit richtigem Encoding
...
sind nur einige. Auch wenn sie dein Problem nicht direkt lösen geben sie sicher Hinweise auf die Lösung und auf das, was dir helfen könnte.
Gruss
Coffeebean
und dazu... C# Reading XML With Namespace.