Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Prism xml Attribute unter .Net (https://www.delphipraxis.net/63767-xml-attribute-unter-net.html)

mikenrw 22. Feb 2006 16:43


xml Attribute unter .Net
 
Hi Delphianer,

habe ein kleines Prob. eines Anfängers.
Möchte eine xml Datei erstellen und Attribute (Value Felder muessen als Variable erstellt werden) erstellen:

Xml-Datei:
languageGrp ->
language (Attribute:TYPE, Value:Source
Attribute:LANG, Value:EN-US)

Wie mache ich das unter Delphi 2005 (.Net)?
Die xml-Datei node usw. Bekomme ich hin, aber wie weise ich Attribute hinzu ?

Vielen Dank an die Experten !

Mike

Master_BB 22. Feb 2006 17:02

Re: xml Attribute unter .Net
 
hi,
ich hab sowas schon mal gemacht hab aber gerade nicht die
möglichkeit und zeit nachzukukn.
aber wenn ichs bei msdn gerade richitg nachgekukt habe,
XMLNode.Attributes.Append sollte deine funktion sein.
XMLNode ist der Knoten der Attribute hinzugefügt bekommen soll
und XMLNode.Attributes ist eine XMLAttributeCollection
zu der du dann beliebigviele Attribute zum Node adden kannst.

ich hab anfangs die XML-Dateien auch mit Hand erstellt,
vieleicht solltest du auch mal bei MSDN unter XMLSerializer
und XMLDeserializer nachschauen. Der konvertiert dir
ganze Objektlisten zu XML Datei und läd sie wieder ein.

Greetz

mikenrw 23. Feb 2006 15:54

Re: xml Attribute unter .Net
 
Hi Graetz,

danke fuer Deine Antwort. ABER es funzt immer nicht.
Vielleicht hast Du noch einen Vorschlag.

Mike

MathiasSimmack 25. Feb 2006 10:09

Re: xml Attribute unter .Net
 
Was Master_BB mit Serialisation meint, ist eine ganz feine Sache. Du brauchst den XML-Code der Datei nicht mehr von Hand erzeugen, sondern du lässt das .NET Framework ackern. Mangels Delphi.NET mal ein Beispiel für deinen Fall in CSharp. Du erstellst eine Language-Klasse mit den von dir gewünschten Inhalten:
Code:
[XmlType("language")]
public class Language
{
   private string languageType;
   private string languageValue;

   public Language() : this(string.Empty, string.Empty)
   {
   }

   public Language(string languageType, string languageValue)
   {
      this.languageType = languageType;
      this.languageValue = languageValue;
   }

   [XmlAttribute("TYPE")]
   public string Type
   {
      get { return this.languageType; }
      set { this.languageType = value; }
   }

   [XmlAttribute("LANG")]
   public string Value
   {
      get { return this.languageValue; }
      set { this.languageValue = value; }
   }
}

// Language language = new Language("Source", "en-US");
Die Deklarationen in den eckigen Klammern sorgen beim Generieren der XML-Datei für das gewünschte Layout. Jetzt benötigst du aber wohl noch eine Basiskollektion für deine Language-Klasse, weil du vermutlich verschiedene Sprachen speichern möchtest. Ich habe mich dafür mal an einem alten Beispiel von Robert_G bedient und es auf den absolut notwendigen bzw. sinnvollen Grundcode verkürzt:
Code:
[XmlRoot("languageGrp")]
public class LanguageGroup : CollectionBase
{
   public Language this[int index]
   {
      get { return ((Language)(List[index])); }
      set { List[index] = value; }
   }

   public int Add(Language language)
   {
      return this.List.Add(language);
   }

   public int Add(string languageType, string languageValue)
   {
      return this.List.Add(new Language(languageType, languageValue));
   }

   // zusätzliche Konstruktoren
   // AddRange-Methoden
   // IndexOf, Contains, Insert usw.
   // ;-)
}


Language language = new Language("Source", "en-US");
LanguageGroup langGroup = new LanguageGroup();

langGroup.Add(language);
langGroup.Add("Source", "de-DE");

// Sprache anhand des Index auswählen
Language selectedLang = langGroup[1];
Console.WriteLine("type {0}, value {1}", selectedLang.Type, selectedLang.Value);

// alles anzeigen
foreach (Language loop in langGroup)
{
   Console.WriteLine("type {0}, value {1}", loop.Type, loop.Value);
}
Jetzt kommt die Serialisation. Dazu genügen die folgenden Zeilen:
Code:
XmlSerializer serialize = new XmlSerializer(typeof(LanguageGroup));
TextWriter writer = new StreamWriter("languages.xml");
serialize.Serialize(writer, languageGroup);
writer.Close();
Und voilà:
XML-Code:
<?xml version="1.0" encoding="utf-8"?>
<languageGrp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>
  <language TYPE="Source" LANG="en-US" />
  <language TYPE="Source" LANG="de-DE" />
</languageGrp>
Und natürlich kannst du die Infos der XML-Datei wieder einlesen und nutzen:
Code:
XmlSerializer serialize = new XmlSerializer(typeof(LanguageGroup));
FileStream reader = new FileStream("languages.xml", FileMode.Open);
LanguageGroup langGroup = (LanguageGroup)serialize.Deserialize(reader);
reader.Close();

foreach (Language language in langGroup)
{
   Console.WriteLine("type {0}, value {1}", language.Type, language.Value);
}
Wie gesagt, sorry, ich habe kein Delphi.NET. Da es sich aber um Befehle aus dem .NET Framework handelt, sollte sich das Beispiel recht schnell "übersetzen" lassen. :oops:

MathiasSimmack 26. Feb 2006 17:29

Re: xml Attribute unter .Net
 
Um dein Problem erneut aufzugreifen: Ist dir nie die Methode "XmlDocument.CreateAttribute" aufgefallen? Das Prinzip ist das gleiche wie beim Erstellen von Knoten mit "CreateElement". Und die erzeugten Attribute hängst du mit "XmlNode.Attributes.Append" an.

mikenrw 26. Feb 2006 17:46

Re: xml Attribute unter .Net
 
Hi,

vielen Dabk und sorry.

Mike


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz