Fiaechen2011 Geschrieben 2. November 2010 Geschrieben 2. November 2010 Als C# Anfänger habe ich im Praktikum ein Problem mit einer mir gestellten Aufgabe und hoffe, das mir hier jemand einen Schubs in die richtige Richtung geben kann. Wir verwenden Visual C# 2010. Ich habe eine XML Datei in der die Beschreibung für 2 durch einen Outerjoin verbundene Tabellen stehen. --- <dmd:model xmlns:dmd="urn:CS.SY_DMD" dominant="RWKonto" > <dmd:table name="RWKonto" primary="rwkto_id"> <dmd:column name="rwkto_id" alias="Id" type="serial" size="4" nullable="false" /> ... </dmd:column> <dmd:join source="rwkto_id" target="rwkto_id" detail="RWEAFremdKonto" lookup="true" outer="true" targetCardinality="0..n"/> </dmd:table> <dmd:table name="RWEAFremdKonto" primary="rweak_id"> <dmd:column name="rweak_id" alias="FremdKontoId" type="serial" size="4" nullable="false" /> … </dmd:table> </dmd:model> --- Nun sollen alle nicht nullbaren durch den Outer Join verbundenen Spalten einen Fehler liefern. Als Lösungsansatz habe ich mir folgendes überlegt: Den Namen von Source und Target aus der Join Zeile auslesen Attribut vom Source einlesen Attribut vom Target einlesen Prüfen Source Attrib.(nullabe = false) = Target Attrib. (nullable = false) = Fehler !!! Nun meine Fragen: Ist dieser Lösungsansatz so umsetzbar und wenn dem so ist, wie kann ich auf die Join Zeile und die Abschnitte der einzelnen Tabellen zugreifen? Gibt es in der Systems.XML einen Befehl dafür, oder muss ich die komplette XML Datei als Text einlesen und die entsprechenden Stellen suchen lassen ? Ich würde mich über jede Hilfestellung sehr freuen. Zitieren
NerdonRails Geschrieben 2. November 2010 Geschrieben 2. November 2010 Mein normaler Ansatz wäre, das ganze in ein XDocument zu packen und dann mit Linq to Xml Queries darauf auszuführen. LINQ to XML LINQ to XML - 5 Minute Overview - Hooked on LINQ Ein weiterer Ansatz wäre, sich per xsd.exe aus der xml-Struktur eine Klasse generieren zu lassen. Generate C# class from XSD file. Ich präferiere ersteres, weil es flexibler ist und meines erachtens nicht soviel overhead mitbringt. Zitieren
2K1.INC Geschrieben 2. November 2010 Geschrieben 2. November 2010 (bearbeitet) ich kann NerdonRails nur zustimmen mit linq ist das echt gut zu lösen... hmm zu deiner frage umsetzbar ist fast alles in der informatik nur sinnvoll und obs funktioniert is ne andre frage... Bevor du suchen kannst musst du das XML-Dokument laden.. dies kann so aussehn public static XDocument loadXDocument(String path) { var fs = File.OpenRead(path); var reader = new XmlTextReader(fs) { WhitespaceHandling = WhitespaceHandling.Significant }; return XDocument.Load(reader); } fs ist ein FileStream die Zeile kannst du dir ganz sparen falls du der Methode einen Stream übergeben würdest (FileStream, MemoryStream etc..) reader is wie der Name schon sagt ein Reader... WhitespaceHandling sagt wie er die Leerzeichen behandeln soll XDocument.Load() ladet die XML var hauptknoten = XCokumentobjekt.Elements(); das liefert alle knoten auf der ersten ebene var knoten = XDocumentobjekt.Elements("Name"); liefert ein bestimmen knoten auch nur auf erster ebene ne rekusive suche falls du nicht weis an welcher stelle sich der Knoten befindet oder du machst es mit XDocument.Elements("XX").Elements("yy").Elements() wenn du genau weist auf welcher ebene der Knoten sich befindet doch selbst dann wär ne rekusive suche schöner und ausbaufähiger fur die Zukunft... es gibt aber noch .Element()/.Element("Name") dies liefert jedoch nur einen Knoten und nicht mehrere bsp <Blubb ID="20"> var x = XDocumentobjekt.Attributes() (das gleiche wie bei Element) for each(item in x ) { var value = item.Value; } in item steht ID und in Item.Value steht dann 20 drin ... Doch vorsicht mit Linq es kann in bestimmten bereichen langsamer werden alls mehrere forschleifen in folge und eine tücke von linq ist noch deferred execution... Bearbeitet 2. November 2010 von 2K1.INC Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.