2009-08-14 4 views
11

Bei der Generierung von XML in C#, gibt es ein Problem mit der Generierung als String? In der Vergangenheit habe ich festgestellt, dass XML programmatisch sehr ausführlich und komplex ist. Das Erstellen des XML-Zeichens durch String-Verkettung/ein String-Builder scheint viel einfacher zu sein, aber es fühlt sich an wie eine schlechte Übung.
Sollte ich XML als Zeichenfolge generieren?Sollte ich XML als Zeichenfolge in C# generieren?

+1

String Verkettung ist in Ordnung, bis das erste Mal, wenn ein Attributwert enthält eine & – AakashM

+0

String Verkettung ist in Ordnung, bis das erste Mal etwas etwas hat man nicht erklären hat. –

+0

Danke für alle Antworten. – macleojw

Antwort

13

Die XDocument-, XElement- und XAttribute-Klassen machen die XML-Generierung in C# viel einfacher. Dann mit dem XmlDocument oder XmlWriter.

<RootElement> 
    <ChildElement Attribute1="Hello" Attribute2="World" /> 
    <ChildElement Attribute1="Foo" Attribute2="Bar" /> 
</RootElement> 

Sie können dies tun:

XDocument xDocument = new XDocument(
    new XElement("RootElement", 
     new XElement("ChildElement", 
      new XAttribute("Attribute1", "Hello"), 
      new XAttribute("Attribute2", "World") 
     ), 
     new XElement("ChildElement", 
      new XAttribute("Attribute1", "Foo"), 
      new XAttribute("Attribute2", "Bar") 
     ) 
    ) 
); 
+0

Muss dies versuchen. Vielen Dank! – macleojw

+0

@Downvoter: Interessieren Sie sich warum? –

2

Erstellen der XML durch die String-Verkettung ist definitiv eine schlechte Praxis

Als Beispiel diese zu produzieren. Das XmlDomDocument ist nicht sehr ausführlich oder convoluted; Ich fand es immer ziemlich einfach (und sicher) mit ihm zu arbeiten.

2

Nein, sollten Sie nicht. Die XML-Bibliotheken in .NET (und anderen Plattformen) stellen sicher, dass Sie gültiges XML erstellen, und sparen Ihnen viel Zeit beim erneuten Analysieren. Wenn jemand anderes Ihr XML verwenden und sich darüber beschwert, dass es falsch ist, können Sie das tun Ausschließen der eigentlichen XML-Datei selbst und spart Ihnen viel Zeit beim Überprüfen, ob Sie richtig verketten.

7

Haben Sie Linq zu Xml versucht? es ist nicht sehr ausführlich:

XElement xml = new XElement("contacts", 
        new XElement("contact", 
         new XAttribute("id", "1"), 
         new XElement("firstName", "first"), 
         new XElement("lastName", "last") 
        ), 
        new XElement("contact", 
         new XAttribute("id", "2"), 
         new XElement("firstName", "first2"), 
         new XElement("lastName", "last2") 
        ) 
       ); 
Console.Write(xml); 
1

ein XmlTextWriter verwenden, können Sie die Ergebnisse in eine String fallen kann und die resultierende Zeichenfolge verwenden. Mit dem XmlTextWriter können Sie den Inhalt auch in einen Stream einfügen. Also, wenn Sie nach Flexibilität suchen, verwenden Sie einen XmlTextWriter.

Wenn Ihre Frage über das Konstruieren einer XML-Datei durch Zeichenfolgenverkettung ist, tun Sie das nicht. Verwenden Sie einen StringBuilder, wenn Sie ein XML-Dokument ohne weitere Hilfe zusammenstellen möchten.

Ich würde vermeiden, manuell erstellen die XML durch "Verkettung". Sie erhöhen die Wahrscheinlichkeit von Fehlern in der generierten XML-Datei. Die XML-Erstellungsklassen von Microsoft wurden ziemlich gründlich getestet. Nutzen Sie das zu Ihrem Vorteil.

3

Ich würde den folgenden Ansatz in den meisten Fällen empfehlen, wenn Sie XML generieren.

  1. Eine XSD für Ihre XML-
  2. Kompilieren Sie das XSD in ein Objekt
  3. Bestücken Sie Ihr Objekt
  4. De-Serialisierung Ihr Objekt in xml

Benifits diese über nur zu tun, die Schaffung XML mit den XMLDocuments 1. Es ist gut mit einem XSD definiert. Andere Entwickler wissen, welche XML sie erhalten (oder was sie ändern). 2. Einfach in der Zukunft zu ändern. 3. Weit größere weniger Chance von Tippfehler in Ihrem XML-Dokument.

Lassen Sie mich wissen, ob Sie Codebeispiele oder zusätzliche Unterstützung bei der Ausführung benötigen.

Hinweis: Wir generieren unsere CS-Dateien zum Zeitpunkt der Erstellung von xsds, um sicherzustellen, dass jemand den generierten Code nicht manuell ändert.

+0

Sie meinen serialisieren in xml, oder? –

+0

Das ist ein wirklich guter Weg, es in vielen Fällen zu tun. –

+0

Ja, aber er schrieb de-serialisieren. –

5

Bevor Sie über das Generieren von XML mit String-Verkettung statt einer richtigen Bibliothek nachdenken, lesen Sie bitte die XML specification. Achten Sie besonders auf Feinheiten wie Zeichensatz und Zeichen.

Sie können es jetzt tun. Ich werde warten.

Jetzt fragen Sie sich - möchten Sie wirklich sicherstellen müssen, dass Ihre verkettete Zeichenfolge gemäß all diesen Regeln gültig ist und alle Hilfsfunktionen selbst schreibt, oder möchten Sie eine gut getestete Bibliothek verwenden, die all diese Logik hat für dich gekapselt worden?

Gut.

Froh, dass das sortiert ist.

+0

Ich empfehle auch http://hsivonen.iki.fi/producing-xml/ für eine Zusammenfassung der Liste der Probleme beim Schreiben von XML aus ... –

+0

+1 für eigentlich einen Grund zu geben, warum es durch String-Verkettung ist eine schlechte Idee –

2

XmlWriter ist nicht so schlimm, wenn Sie Ihren Code sind Formatierung korrekt:

StringBuilder builder = new StringBuilder(); 
using (XmlWriter writer = XmlWriter.Create(builder)) 
{ 
    writer.WriteStartDocument(); 

    writer.WriteStartElement("root"); 

    writer.WriteStartElement("Node1"); 
    writer.WriteAttributeString("att1", "value"); 
    writer.WriteEndElement(); 

    writer.WriteStartElement("Node2"); 
    writer.WriteString("inner text"); 
    writer.WriteEndElement(); 

    writer.WriteEndElement(); 

    writer.WriteEndDocument(); 
} 

Sie auch identation in Ihrem Code zu erleichtern das Verständnis hinzufügen könnte.

using (XmlWriter writer = XmlWriter.Create(builder)) 
{ 
    writer.WriteStartDocument(); 
    { 
     writer.WriteStartElement("root"); 
     { 
      writer.WriteStartElement("Node1"); 
      writer.WriteAttributeString("att1", "value"); 
      writer.WriteEndElement(); 

      writer.WriteStartElement("Node2"); 
      writer.WriteString("inner text"); 
      writer.WriteEndElement(); 
     } 
     writer.WriteEndElement(); 
    } 
    writer.WriteEndDocument(); 
} 
Verwandte Themen