Zitat von
Phoenix:
Erm. Also wenn ich mein DataSet dazu anweise Dein Schema zu laden schmeisst mir das Exceptions um die Ohren dass es nur so kracht. Das kann also schonmal gar nicht funktionieren.
Falls es die
IDE nicht verkraftet, kannst du immer noch direkt XSD.exe benutzen um deine DataSet Klasse generieren zu lassen.
Zitat:
Und wieso ist mein Schema unpassend? Natürlich habe ich relationale Daten: Wenn ich einen User lösche dann soll mir das DataSet dazu selbstverständlich alle zugehörigen Einträge aus der Texte-Tabelle mitlöschen. Und zwar automatisch.
Jain, du benutzt mit
XML ein hierarchisches Format. Wenn du die Daten unnötig relational ablegst/ausliest müssen sie ständig zur Laufzeit den einzelnen Benutzern zugeordnet werden. Dadurch wird die
XML Datei größer und du verbrätst zur Laufzeit unnötig Dampf.
Zitat:
Das geht natürlich nur, wenn das DataSet über die Relation dem Eintrag in der Benutzertabelle auch die Einträge in dier Texte-Tabelle zuordnen kann. Und wenn sich ein User authentifiziert, dann sollen auch nur seine Notizen angezeigt werden und nicht die von allen Usern.
Das geht sehr wohl, wenn man die Texte eines Benutzers als Element in den Typen packt. [msdata:IsNested="true"] macht das sogar einem dummen DataSet klar.
Ich habe das gerade mal ausprobiert und eine Mini-
GUI zusammengeGUIt.
Das hier kommt dabei raus und lässt sich auch wieder einlesen: (siehe screenie)
XML-Code:
<?
xml version="1.0" standalone="yes"?>
<dsTexte xmlns="phoenix.net/Benutzer">
<Benutzer>
<userId>a</userId>
<Texte>
<headline>eene</headline>
</Texte>
<Texte>
<headline>meene</headline>
</Texte>
<Texte>
<headline>muuh</headline>
</Texte>
</Benutzer>
<Benutzer>
<userId>b</userId>
<Texte>
<headline>1</headline>
</Texte>
<Texte>
<headline>2</headline>
<text>bla ba</text>
</Texte>
<Texte>
<headline>3</headline>
</Texte>
</Benutzer>
<Benutzer>
<userId>c</userId>
<Texte>
<headline>4</headline>
</Texte>
<Texte>
<headline>5</headline>
</Texte>
<Texte>
<headline>6</headline>
</Texte>
</Benutzer>
</dsTexte>
Ich habe das Schema noch verändert so dass es Elemente statt Attribute benutzt. DataSets scheinen schlichtweg zu dämlich zu sein um sich an Attribute zu halten (Die generierte
XML Datei war zwar wieder einlesbar aber furchtbar hässlich...)
XML-Code:
<?
xml version="1.0" encoding="utf-8"?>
<xs:schema id="dsTexte"
targetNamespace="phoenix.net/Benutzer"
xmlns:mstns="phoenix.net/Benutzer"
xmlns="phoenix.net/Benutzer"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-
com:
xml-msdata"
attributeFormDefault="unqualified"
elementFormDefault="qualified">
<xs:element name="dsTexte"
msdata:IsDataSet="true">
<xs:complexType>
<xs:choice minOccurs="0"
maxOccurs="unbounded">
<xs:element name="Benutzer">
<xs:complexType>
<xs:sequence>
<xs:element name="userId"
type="xs:string"
minOccurs="1"
maxOccurs="1"/>
<xs:element name="password"
type="xs:string"
minOccurs="0"
maxOccurs="1"/>
<xs:element msdata:IsNested="true"
name="Texte"
minOccurs="0"
maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="headline"
type="xs:string"
minOccurs="1"
maxOccurs="1"/>
<xs:element name="text"
type="xs:string"
minOccurs="0"
maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:unique name="Constraint1">
<xs:selector xpath=".//Benutzer" />
<xs:field xpath="userId" />
</xs:unique>
</xs:element>
</xs:schema>
Ich habe es außerdem zum Test auch mal durch XSD von .Net 1.1 gejagt: Auch dort lief alles problemlos...
Delphi-Quellcode:
var ds := new dsTexte();
var fileName := 'Texte.xml';
ds.ReadXml(fileName);
for benutzer : dsTexte.BenutzerRow in ds.Benutzer do
begin
Console.WriteLine(benutzer.userId);
for text : dsTexte.TexteRow in benutzer.GetTexteRows() do
begin
Console.WriteLine('-> {0}', text.headline);
if not text.istextNull() then
Console.WriteLine('--> {0}', text.text);
end;
end;
ds.WriteXml(fileName);
Output
a
-> eene
-> meene
-> muuh
b
-> 1
-> 2
--> bla ba
-> 3
c
-> 4
-> 5
-> 6
hui... schon wieder viel zuviel wegen einer Kleinigkeit getippt...