2009-01-29 5 views
9

In meinem Projekt gibt es Situationen, in denen wir XML-Nachrichten (als char *) zwischen Modulen senden müssen. Sie sind nicht wirklich groß, nur 10-15 Zeilen. Im Moment erstellt jeder die Saite selbst. Ich denke nicht, dass dies der richtige Ansatz ist. Wir verwenden bereits die Xerces-DOM-Bibliothek. Warum also nicht einen Dombaum erstellen, ihn serialisieren und dann senden?Erstellen von XML in C++ Code

Was schlagen Sie vor?

Antwort

6

Wenn Sie wirklich nur kleine XML-Nachrichten erstellen, ist Xerces ein Overkill, IMHO. Es ist eine Parser-Bibliothek, und Sie analysieren nichts.

+2

Ich bin nicht einverstanden stark. Das manuelle Erzeugen von XML ist ziemlich fehleranfällig (Probleme mit der Codierung, Entweichen von Zeichen). Daher empfehle ich, einen Baum (DOM oder etwas anderes) zu erstellen und ihn dann zu serialisieren. – bortzmeyer

+1

Hey, ich habe gerade gesagt "Xerces ist ein Overkill". Das Entkommen kann (und sollte) von einer einzigen Funktion oder einer leichtgewichtigen Bibliothek wie Genx gehandhabt werden: http://www.tbray.org/ongoing/genx/docs/Guide.html - Nemanja Trifunovic –

1

Metriken

vergleichen, wie lange es Sie die Zeichenfolge ein Dutzend Mal oder so manuell erstellen nimmt, dann vergleichen, wie lange es mit der Bibliothek nimmt.

Wenn Ihre Teammitglieder wie meine sind, werden sie schnell ihre Meinung ändern.

plus Faktor in QA Zeit, wenn sie es falsch codieren, etc ...

die Bibliothek benutzen, so viel wie möglich.

2

Ich schlage vor, den DOM-Baum zu erstellen. Sie müssen sich keine Gedanken über das Entweichen von XML-Zeichen in Ihren Daten machen. Wenn ein Entwickler einmal vergisst, könnten Sie Benutzereingaben haben, die Ihre XML-Ausgabe falsch machen.

0

Ich würde nur den DOM-Baum verwenden. Auf diese Weise müssen Sie die Daten beim Senden und Empfangen der XML-Strings nicht vor und zurück analysieren.

--- Leicht off topic: Für andere Menschen gerade durch diesen Beitrag löschen und durch Zufall brauchen eine ultraleichtes DOM XML-Framework diese verwendet ein: http://www.applied-mathematics.net/tools/xmlParser.html

Es ist sehr einfach zu bedienen und besteht aus 2 Dateien.

1

Ich hatte das gleiche Problem mit XML-Nachrichten zwischen eingebetteten Geräten übergeben möchten.

Ich schrieb Folgendes (alles in einer Header-Datei), um eine schnelle API zum Parsen und Generieren von XML zu sein. Es werden nicht alle von XML-Funktionen unterstützen, aber die meisten einfachen XML-Nachrichten sie ohnehin nicht brauchen:

http://www.scottlangham.co.uk/2009/01/rapidxml-a-quick-xml-parsergenerator-for-c/

Es Beispiel für die Verwendung in den Kommentaren dargestellt ist.

xml So schreiben Sie das so etwas wie folgendes tun:

int isbn = 2938237; 
wstring authorName = "Isaac Asimov"; 
wstring borrower = "Mr. Blobby"; 

CWTag bookTag = libraryTag(L"Book") 
    (L"author",authorName) (L"isbn",isbn) (L"borrower",borrower); 
bookTag(L"Review") (L"comments", L"very good"); 

und dies führt in der neuen XML hinzugefügt unter dem Stichwort:

<Book author="Isaac Asimov" isbn="2938237" borrower="Mr. Blobby"> 
    <Review comments="very good"/> 
</Book> 

Wir versuchen, haben eine andere Bibliothek, kann ich Erinnere dich daran und fand, dass es nicht schnell genug war. Wir wollten nicht bei der manuellen Formatierung von Strings bleiben, weil wir mit einer Menge Nachrichten zu tun hatten.

3

Sie könnten das DOM verwenden oder Ihr eigenes kleines C++ - XML-Generierungsframework schreiben.

Die Xerces API von Java portiert wurde und durch Objekt Umfang verwenden Sie XML von C++ Code zu erzeugen noch einfacher machen:

XmlWriter w; 
Elem book = w.Element("book"); 
book.addAttrib("title", "Lord of the Rings"); 
Elem author = e.addChild("author"); 
author.addAttrib("age", 43); 
author.addText("Tolkien"); 

Dies würde in der folgenden XML: Wenn

<book title="Lord of the Rings"> 
    <author age="43">Tolkien</author> 
</book> 
0

Wenn Sie eine mittlere bis große XML-Datei erstellen, benötigen Sie eine Bibliothek, die Sie unterstützt. Wenn Sie eine kleine bis sehr kleine XML-Datei erstellen, können Sie auch einfach den Text dorthin streamen.

astream << "<book title=\"Lord of the Rings\"><author age=\"43\">Tolkien</author></book>" 

ungefähr so ​​einfach ist, wie Sie für diese Größe XML-Fragment erhalten können, wenn Ihre XML-Dateien, die groß sind, dann kann man auch nur um sie auf diese Weise bauen - nicht versuchen, Dinge für einige nur verkomplizieren puristisches Ideal, das dir nicht wirklich hilft.

Wie Optimierung, sollten Sie nie Dinge ändern, ohne zu messen, welche Wirkung es hätte. Wenn Ihr Code beibehalten werden kann, bleiben Sie dabei. Versuchen Sie nur, es zu ändern, wenn Sie seine Wartbarkeit gemessen haben (dh bemerkt, es ist peinlich, die XMLs zu aktualisieren) und festgestellt, dass es für Komfort zu lange dauert.

+0

, solange der Programmierer weiß wie mit Zeichen wie '<' and '>' und '&' in den XML-Elementen umgehen - und auch Unicode. – jdkoftinoff

2

Das Erstellen von XML per Hand ist eine der sichersten Arten des Wahnsinns, die ich kenne. Irgendwann wird jemand irgendwo eine Entität vermasseln, oder eine nachlaufende Klammer wird weggelassen oder etwas ... benutze einfach eine Bibliothek. GenX wäre meine Wahl.

Bearbeiten: Misread Ihren Beitrag. Wenn Sie bereits eine Generationenbibliothek haben, verwenden Sie diese. Verkomplizieren Sie die Dinge nicht unnötig, wenn Sie es vermeiden können.

0

Ich verwende tatsächlich CMarkup von FirstObject.com.

Codeproject hat eine ältere Distribution und Text Tutorial (http://www.codeproject.com/KB/cpp/markupclass.aspx)

-Source-Code zur Verfügung stehen und die Komponente kommt in verschiedenen Geschmacksrichtungen (Developer, Advanced Developer) über die Firstobject Download-Seite (n).

Die FirstObject-Website enthält viele hilfreiche Beispiele und sie verteilen sogar einen kostenlosen XML-Editor.

Nein Ich bin kein Angestellter, aber ich bin ein zufriedener Besitzer der Komponente.

3

Schnell und einfach, versuchen TinyXml API:
http://www.grinninglizard.com/tinyxml/

+0

Um die Qualität zu überprüfen, sehen Sie, wer im SDK von Adobe vorhanden ist. schauen Sie in \ sdk91_v1_win \ Adobe \ Acrobat 9 SDK \ Version 1 \ NonAdobeSupport \ TinyXML (http://download.macromedia.com/pub/developer/acrobat/sdk/9/sdk91_v1_win.zip) – lsalamon