Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   XML mit C# (https://www.delphipraxis.net/65996-xml-mit-c.html)

Luckie 23. Mär 2006 10:44


XML mit C#
 
Hallo, ich muss ein XML Dokument mit C# zusammenbauen. Dieses Dokument wird aber nicht als Datei gespeichert, sondern dann als Text verschickt.

Ich habe mich hier und im Internet schon umgesehen, aber ich weiß nicht, wie ich:
  • Ein XML Dokument erstelle
  • Einen Knoten hinzufüge
  • In ein Tag etwas hineinschreibe
  • Und wie ich dann an den gesamten Text drankomme

Beispiel:
XML-Code:
<xml>
  <projekt>
    <interner_name>SuperduperSoftware</interner_name>
    <beschreibung>geiles Teil</beschreibung>
    <status>fast fertig</status>
  </projekt>
</xml>
PS: Gibt es irgendwo ein gutes Tutorial zu diesem Thema (XML und C#)? Da bin ich mit Mr. Google nämlich auch nicht richtig fündig geworden. :(

Matze 23. Mär 2006 10:50

Re: XML mit C#
 
Hi, auf Geloleocomputing steht dazu folgendes:

Zitat:

31.5 XML-Verwendung in C#

Obwohl C# die XML-Dokumentation unterstützt (siehe Kapitel 31, C# im Detail, Abschnitt »XML-Dokumentation«), bietet C# keine Sprachunterstützung für die Verwendung von XML.

Das ist aber okay, denn die Common Language Runtime bietet umfangreiche XML-Unterstützung. In diesem Themenbereich sind besonders die Namespaces System.Data.Xml und System.Xml von Interesse.
Vielleicht hilft dir das ein wenig. Wenn nicht, sorry.

sakura 23. Mär 2006 10:55

Re: XML mit C#
 
Einfach mal so...
Code:
using System.Xml;
...
   XmlDocument xml = new XmlDocument();
   XmlNode root = xml.AppendChild(xml.CreateNode(XmlNodeType.Element, "xml", ""));
   XmlNode project = root.AppendChild(xml.CreateNode(XmlNodeType.Element, "project", ""));
   project.AppendChild(xml.CreateNode(XmlNodeType.Element, "interner_name", "")).InnerText = "SuperduperSoftware";
   project.AppendChild(xml.CreateNode(XmlNodeType.Element, "beschreibung", "")).InnerText = "geiles Teil";
   project.AppendChild(xml.CreateNode(XmlNodeType.Element, "status", "")).InnerText = "fast fertig";

   textBox1.Text = xml.InnerXml;
...:cat:...

Luckie 23. Mär 2006 11:02

Re: XML mit C#
 
@matze: Jupp. Mit dem Namespace habe ich ja schon rumprobiert.

@leidensgenosse: Danke. Sieht gut aus. ;)

So, da ich das Thema ja etwas allgemein gehalten habe, kann ich hier gleich weiter machen. ;)

Jetzt bräuchte ich den umgekehrten Weg. Also das XML Dokument (Beispiel siehe oben)= liegt mir als String vor. Wie komme ich jetzt wieder an die darin enthaltenen Informationen dran. Ich habe da was von XPath gehört. Man gibt also den Pfad zu dem Knoten irgendwie an und kann dann direkt die Informationen auslesen. Habe ich das richtig verstanden? Und wie würde das jetzt konkret aussehen?

Luckie 23. Mär 2006 13:43

Re: XML mit C#
 
Ich habe mal versucht mich vorsichtig ranzutasten:
Code:
            try
            {
                XmlTextReader xmltr = new XmlTextReader(s);
                xmltr.Read();                            
                lblCurProject.Text = xmltr.Name;
                xmltr.Close();
            }
            catch (System.Xml.XmlException xmle)
            {
                MessageBox.Show(xmle.Message);
            }
Aber ich bekomme jedesmal eine Exception, obwohl ich dachte, dass ich es ganuso mache wie in dem Beispiel aus der Hilfe. :gruebel:

Und zwar fliegt es mir hier: XmlTextReader xmltr = new XmlTextReader(s); schon um die Ohren. In s steht aber genau das drinne, was ich weiteroben zusammengebastelt habe:
Zitat:

<xml><project><internername>SuperduperSoftware</internername><beschreibung>geiles Teil</beschreibung><status>fast fertig</status></project></xml>

go7chib 23. Mär 2006 14:11

Re: XML mit C#
 
Also den XmlReader mag ich nicht und nutz ich nicht.
Ich mach das immer so:
Code:
XMlDocument xmlDoc=new XmlDocument();
XmlDocument.LoadXML(xmlstring);

XmlNode node = new xmlNode();
node=xmlDoc.SelectSingleNode("xml/project/internername"); // evtl. statt Slashes Backslashes, weiß es grad nicht, evtl. muss an den Anfang auch ein Slash
MessageBox.Show(node.Text);

Luckie 23. Mär 2006 14:20

Re: XML mit C#
 
Hm, das sieht doch schon mal schön aus. Nur sagt er mir hier:
Code:
XmlNode node = new XmlNode();
Zitat:

Es konnte keine Instanz der abstrakten Klasse oder Schnittstelle "System.Xml.XmlNode" erstellt werden.

go7chib 23. Mär 2006 14:22

Re: XML mit C#
 
ups... XmlNode node
reicht aus, es muss nicht extrta eine Objektinstanzt erzeugt werden, is mir grad eingefallen...

Waldteufel 23. Mär 2006 14:24

Re: XML mit C#
 
Also bei mir gibt's kein XmlNode.Text... :gruebel:

Edit: .NET Framework 2

go7chib 23. Mär 2006 14:27

Re: XML mit C#
 
Stimmt.. hab das grad aus'm Kopf geschrieben... hab nachgeguckt, heißt
node.InnerText

Luckie 23. Mär 2006 14:29

Re: XML mit C#
 
Ups. Da kommt wieder meine C# Unerfahrenheit zum Vorschein. :oops:

Jetzt bekomme ich zwar den Namen: lblCurProject.Text = node.Name; aber mit node.Value keinen Wert.

Waldteufel 23. Mär 2006 14:35

Re: XML mit C#
 
Das ist nicht weiter verwunderlich. In der Hilfe steht zu XmlNode.Value:

XmlNode.Value
Eigenschaftenwert

Der zurückgegebene Wert hängt vom NodeType des Knotens ab:

Attribute: Der Wert des Attributs.

CDATASection: Der Inhalt des CDATA-Abschnitts.

Comment: Der Inhalt des Kommentars.

Document: NULL (Nothing in Visual Basic).

DocumentFragment: NULL (Nothing in Visual Basic).

DocumentType: NULL (Nothing in Visual Basic).

Element: NULL (Nothing in Visual Basic). Auf den Wert des Elementknotens kann über die XmlElement.InnerText-Eigenschaft oder die XmlElement.InnerXml-Eigenschaft zugegriffen werden.

Entity: NULL (Nothing in Visual Basic).

EntityReference: NULL (Nothing in Visual Basic).

Notation: NULL (Nothing in Visual Basic).

ProcessingInstruction: Der gesamte Inhalt mit Ausnahme des Zieles.

Text: Der Inhalt des Textknotens.

SignificantWhitespace: Die Leerraumzeichen. Leerraum kann aus einem oder mehreren Leerzeichen, Wagenrückläufen, Zeilenvorschüben und Tabstopps bestehen.

Whitespace: Die Leerraumzeichen. Leerraum kann aus einem oder mehreren Leerzeichen, Wagenrückläufen, Zeilenvorschüben und Tabstopps bestehen.

XmlDeclaration: Der Inhalt der Deklaration (d. h. alle Zeichen zwischen <?xml und ?>).


PS: Will heißen
Code:
XMlDocument xmlDoc = new XmlDocument();
XmlDocument.LoadXML(xmlstring);

XmlNode node = xmlDoc.SelectSingleNode("/xml/project/internername");
MessageBox.Show(node.InnerText);

merlin17 23. Mär 2006 14:42

Re: XML mit C#
 
Hallo Luckie,

als Lektüre zu XML kann ich dir das Buch "XML essential" von AddisonWesley empfehlen... (ISBN- 3-8273-1769-x, absolut genial, DAS XML-Buch in meinen Augen).

Willst Du über DOM oder SAX gehen ??!?!

In .net gibt es (meines Wissens) kein SAX um XML-Docs schnell und effektiv zu lesen, aber nicht wirklich schlimm...
probiere mal folgendes aus:
Delphi-Quellcode:
XMLReader xreader = XmlReader.Create("dp.xml");
while (xreader.ReadToFollowing("Knoten")
{
Console.WriteLine(xreader.ReadString());
}
xreader.Close();

:-) thomas

Luckie 23. Mär 2006 14:47

Re: XML mit C#
 
Wenn ich im Konstruktor auch einen String übergeben kann, dann wäre das eine alternative. Aber so klappt es auch schon prima.

MathiasSimmack 23. Mär 2006 14:56

Re: XML mit C#
 
Zitat:

Zitat von go7chib
Code:
// evtl. statt Slashes Backslashes, weiß es grad nicht, evtl. muss an den Anfang auch ein Slash

Slashes sind schon richtig, und an den Anfang müssen nur welche, wenn du quasi vom Root aus suchen willst. Wenn dein aktueller Knoten der Root selbst ist, spielt es keine Rolle, aber ich spare mir meist das Hantieren mit bestimmten Knoten, sondern ich greife gleich von ganz oben (quasi von meiner XmlDocument-Variablen) ab.

Luckie 29. Mär 2006 11:39

Re: XML mit C#
 
Eine letzte Frage zum Thema, dann haben wir es geschafft. Wie kann ich Attribute zu einem Element hinzufügen und wieder auslesen?
XML-Code:
XmlDocument xml = new XmlDocument();
XmlNode msg = xml.AppendChild(xml.CreateNode(XmlNodeType.Element, "message", ""));
XmlAttribute attr =
Irgendwie so habe ich es versucht.

Und wie kann ich kontrollieren, ob es geklappt hat? Stehen die Attribute dann auch in xml.InnerText:
Code:
Console.WriteLine(xml.InnerXml);

Luckie 29. Mär 2006 12:51

Re: XML mit C#
 
Neue Erkennsnis:
Code:
XmlDocument xml = new XmlDocument();
XmlNode msg = xml.AppendChild(xml.CreateNode(XmlNodeType.Element, "message", ""));
XmlAttribute attr = xml.CreateAttribute("from");
attr.InnerText = xmpp1.User;
Ist das so richtig? Denn mit...
Code:
Console.WriteLine(xml.InnerXml);
...wird es mir nicht mit ausgegeben.

sakura 29. Mär 2006 13:13

Re: XML mit C#
 
Du musst das Attribute auch noch der Node hinzufügen :zwinker:
Code:
msg.Attributes.Append(attr);
...:cat:...

Luckie 29. Mär 2006 13:18

Re: XML mit C#
 
Klingt sinnvoll. Das so was in der Art da irgendwie fehlt, hatte ich mir auf der Toilette auch gerade überlegt. ;)

MathiasSimmack 29. Mär 2006 20:54

Re: XML mit C#
 
Deine besten Ideen hast du auf diesem Örtchen, wie? :stupid: Es ist nicht das erste Mal, dass du die Toilette so speziell erwähnst. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:57 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