Laden...

XML Einlesen

Erstellt von derott vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.585 Views
D
derott Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren
XML Einlesen

verwendetes Datenbanksystem: <xml>

Hallo,
Also ich muss erstmal sagen das ich der totale newbie bin was c# angeht aber ich bin auch bereit bissel was zu lesen wenn ihr mir nen tip gebt.

Mein Problem ist das das ich versuche eine XML datei irgendwie einzulesen. Ich hatte bis jetzt zwei oder drei versuche gestartet die alle mehr oder weniger gut gelungen sind.

z.b hab ich es geschaft mit diesem code hier einzellne Tabellen in ein datagrib zu laden.


            string myXMLfile = @"C:\\Test_PASSUS.xml";
            DataSet ds = new DataSet();
            // Create new FileStream with which to read the schema.
            System.IO.FileStream fsReadXml = new System.IO.FileStream
                (myXMLfile, System.IO.FileMode.Open);
            try
            {
                ds.ReadXml(fsReadXml);
                dataGrid1.DataSource = ds;
                dataGrid1.DataMember = "Material";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                fsReadXml.Close();
            }

das Problem ist aber das die tabelle "Material" noch unterelemente haben kann welche mir leider nicht ausgegeben werden.

hier ein beispiel für ein "material"


<material ID="344490030" materialGroupID="3" name="Funkentstördrossel" basicUnit="kg" description="Funkentstördrossel" type="neutral">
	<units>
		<unit ID="13" name="Stk." coefficient="0.004" description="Drosselgewicht"/>
	</units>
	<costs costTypeGroupID="3" accountNo="5500" currencyID="1" valuationPrice="0.2042"/>
	<containedMaterials>
		containedMaterial ID="1" materialGroupID="4" name="Kupfer" basicUnit="kg" description="Kupferdraht" type="neutral" quantity="1" unit="m">
			<units>
				<unit ID="1" name="m" coefficient="0.25" description="Kupferdraht"/>
			</units>
		</containedMaterial>
	</containedMaterials>
</material>

Das datagrib hab ich erstmal genommen weil ich nen ergebniss sehen wollte, später wer es natürlich sinnvoller die daten gleich in eine Tabelle/Array zu schreiben.

Habt ihr ein tip wie hierbei weiterkomme?
mfg DerOtT

189 Beiträge seit 2006
vor 16 Jahren

Hallo,

für solche Zwecke gibt es die XmlReader-Klasse.

knub

A
254 Beiträge seit 2007
vor 16 Jahren

Hallo,

es gibt da mehrere Möglichkeiten.

1.) Du könntest dich direkt durch den DOM Baum hangeln.

 XmlDocument doc = new XmlDocument();
     doc.Load(" DateiName");
     XmlNode root = doc.DocumentElement();
     XmlNode node = root.FirstChild;
    usw.
Ist zugegeben sehr aufwendig. Aber für einen ersten Kontakt mit XML finde ich   
es lehrreich.  
  1. ) Wie oben angesprochen mit XML Serialisierung.
    Hier musst Du mit XML Attributen Dein XMl Dokument nachbauen. Wenn Du
    das XMl Dokument über diese Klassenhierarchie erzeugtst, ist dies die Lösung
    die ich anpeilen würde. Hab schon schlechte Erfahrung gemacht, wenn ich das
    XML von wo anderst her bekomme.

    Falls Du ein Beispiel brauchst könnte ich da was beisteuern.

    Du kannst Dir die Klassen auch automatisch generieren. Dazu nimmst Du die
    xsd Defintion Deines XML-Dialektes, wenn nicht vorhanden, kannst Du auch das generieren lassen. Mit dem Tool xsd kannst Du Dir die Klassen generieren lassen.

Tschüss

D
derott Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren

Hi danke,
Ich werd mal nen bissel rumprobieren.

Ja die variante mit xsd hab ich schon ausprobiert


Xsd.exe /d /l:C# PASSUS.xsd

Aber ich bekomm leider immer die fehlermeldung das ein
"Zirkelverweis im ComplexTyp 'T_Material'" ist.

Und mit DOM hab ich es auch schon versucht, bin aber schon beim versuch gescheitert die "Material" zu counten. Wobei es mit einer anderen xml funktioniert hat.


        XmlDocument doc = new XmlDocument();
        doc.Load("c://test_passus.xml");

        XmlNodeList nodeList;
        XmlNode root = doc.DocumentElement;

        nodeList = root.SelectNodes("descendant::material");


        int zahl = nodeList.Count;
        Console.WriteLine(zahl);

Ich werds mal mit deinem code versuchen.

mfg DerOtT

A
254 Beiträge seit 2007
vor 16 Jahren

Die Auswertung per DOM Zugriff sollte auf jedenfall zu machen sein. Falls Du nicht weiter kommst kannst Du ja mal Deinen Code hochladen.

D
derott Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren

ich weiss meine antwort lies lange auf sich warten, doch die ganze sache hatte bis jetzt keine priorität...

mein code:


using System;
using System.IO;
using System.Xml;

public class Sample
{
   
    public static void Main()
    {
        string attribute_ID;
        string attribute_name;
        string attribute_materialGroupID;
        string attribute_basicUnit;
        string attribute_description;
        string attribute_type;

        int i;i = 0;
        XmlNode knoten;
        XmlDocument doc = new XmlDocument();
        doc.Load("c://test_passus.xml");
        XmlNode root = doc.DocumentElement;
        XmlNode node = root.FirstChild;

        node = root.FirstChild;
        node = node.FirstChild;
        node = node.NextSibling;
        node = node.NextSibling;
        node = node.NextSibling;
        node = node.NextSibling;
        
        XmlNodeList materialxs = node.SelectNodes("*");
        int IDzahl = materialxs.Count;

        Console.WriteLine("Elemente: " + IDzahl + node.Name);
        node = node.FirstChild;
        

        while (i<=IDzahl-1)
        {
        knoten = materialxs.Item (i);
        attribute_ID = knoten.Attributes["ID"].InnerText;
        attribute_name = knoten.Attributes["name"].InnerText;
        attribute_materialGroupID = knoten.Attributes["materialGroupID"].InnerText;
        attribute_basicUnit = knoten.Attributes["basicUnit"].InnerText;
        attribute_description = knoten.Attributes["description"].InnerText;
        attribute_type = knoten.Attributes["type"].InnerText;
        Console.WriteLine("ID: " + attribute_ID);
        Console.WriteLine("Name: " + attribute_name);
        Console.WriteLine("materialGroupID: " + attribute_materialGroupID);
        Console.WriteLine("basicUnit: " + attribute_basicUnit);
        Console.WriteLine("description: " + attribute_description);
        Console.WriteLine("attribute_type: " + attribute_type);
        i++;
        }
    }
}

wenn ich mich richtig erinner habe ich DOM benutzt.

  1. mich würde intressieren welche möglichkeiten es noch gibt ein XML dokument einzulesen.

  2. wie kann ich mein code optimieren?
    ich habe schon versucht direkt auf das XML elemet material zuzugreifen aber leider hab ich das noch nicht geschaft.
    kann mir da jemand weiterhelfen?
    hier dir ein link in dem der aufbau der XML beschrieben ist
    http://h1267404.stratoserver.net/uni/passus.jpg

M
190 Beiträge seit 2007
vor 16 Jahren

Hi,
also zum drüber laufen ist die foreach(Xmlnode node in root.nodes) ganz gut
und auf Elemente wie Material kannst du dann mit node.name zugreifen.