Montag, 19. Februar 2007
Serialisierung und Deserialisierung in C#
XML Klassen Generator für C# mit Hilfe von XSD für eine Deserialisierung
Angenommen wir haben eine XML-Datei und wir wollen sie deserialisieren. Bei einer einfachen XML ist es einfach, aber sobald die XML komplexe Typen hat, kann es länger dauern sie fehlerfrei zu implementieren.
XSD kommt mit dem .NET Framework SDK. ES hat zwar keine Benutzeroberfläche, aber man kann es über die Konsole bedienen.
Wir starten von Visual Studio 2005 -> Visual Studio Tools -> Visual Studio Command Prompt.
Als nächstes benötigen wir eine gültige XML Datei, aus welcher wie eine Klasse generieren wollen. Als einfaches Beispiel bietet sich der XML-Ausgabe einer Yahoo Suche an. Einfach die Ausgabe dieser Suchanfrage herunterladen Yahoo Search xml+class+generator und abspeichern (z.B.: auf c:\webSearch.xml).
Wir benutzen das Kommando xsd um die xsd-Schema-Datei zu generieren.
C:\>xsd webSearch.xml
Microsoft (R)-Unterstützungsprogramm für XML-Schemas oder Datentypen
[Microsoft (R) .NET Framework, Version 2.0.50727.42]
Copyright (C) Microsoft Corporation. All rights reserved.
Datei ‘C:\webSearch.xsd’ wird geschrieben
Als Nächstes kann man die generierte XSD-Datei benutzen um eine Klasse zu generieren. Die Standardausgabe ist in C#. Aber es ist auch möglich eine VB-Klasse generieren zu lassen (/language:vb).
C:\>xsd webSearch.xsd /CLASSES /language:cs
Microsoft (R)-Unterstützungsprogramm für XML-Schemas oder Datentypen
[Microsoft (R) .NET Framework, Version 2.0.50727.42]
Copyright (C) Microsoft Corporation. All rights reserved.
Datei ‘C:\webSearch.cs’ wird geschrieben
Nun haben wir eine Klassendatei, die wir benutzen können um das XML-Objekt ohne Exception deserialisieren zu können. Mit folgenden Code kann man dann eine einfache Ausgabe des Objektes bewerkstelligen.
using System;
using System.Collections.Generic;
using System.Text;
namespace XSDTest
{
class Program
{
static void Main(string[] args)
{
System.IO.StreamReader str = new System.IO.StreamReader(“webSearch.xml”);
System.Xml.Serialization.XmlSerializer xSerializer = new System.Xml.Serialization.XmlSerializer(typeof(ResultSet));
ResultSet res = (ResultSet) xSerializer.Deserialize(str);
foreach (ResultSetResult r in res.Result)
{
Console.WriteLine(r.Title);
Console.WriteLine(r.Summary);
Console.WriteLine();
}
str.Close();
Console.ReadLine();
}
}
}
Die Ausgabe sieht dann wie folgt aus:
XML Class Generator for C++
Oracle9i XML Developer’s Kits Guide - XDK. Release 2 (9.2) Part Number A96621-01
. 19. XML Class Generator for C++ This chapter contains the following sections:
Accessing XML C++ Class Generator … Accessing XML C++ Class Generator. The XML
C++ Class Generator is provided with Oracle9i and is also available for …
XML Class Generator for Java
Oracle9i XML Developer’s Kits Guide - XDK. Release 2 (9.2) Part Number A96621-01
. 7. XML Class Generator for Java. This chapter contains the following sections:
Accessing XML Class Generator for Java … The Oracle XML Class Generator for J
ava is provided with Oracle9i’s XDK for Java …
Angenommen wir haben eine XML-Datei und wir wollen sie deserialisieren. Bei einer einfachen XML ist es einfach, aber sobald die XML komplexe Typen hat, kann es länger dauern sie fehlerfrei zu implementieren.
XSD kommt mit dem .NET Framework SDK. ES hat zwar keine Benutzeroberfläche, aber man kann es über die Konsole bedienen.
Wir starten von Visual Studio 2005 -> Visual Studio Tools -> Visual Studio Command Prompt.
Als nächstes benötigen wir eine gültige XML Datei, aus welcher wie eine Klasse generieren wollen. Als einfaches Beispiel bietet sich der XML-Ausgabe einer Yahoo Suche an. Einfach die Ausgabe dieser Suchanfrage herunterladen Yahoo Search xml+class+generator und abspeichern (z.B.: auf c:\webSearch.xml).
Wir benutzen das Kommando xsd um die xsd-Schema-Datei zu generieren.
C:\>xsd webSearch.xml
Microsoft (R)-Unterstützungsprogramm für XML-Schemas oder Datentypen
[Microsoft (R) .NET Framework, Version 2.0.50727.42]
Copyright (C) Microsoft Corporation. All rights reserved.
Datei ‘C:\webSearch.xsd’ wird geschrieben
Als Nächstes kann man die generierte XSD-Datei benutzen um eine Klasse zu generieren. Die Standardausgabe ist in C#. Aber es ist auch möglich eine VB-Klasse generieren zu lassen (/language:vb).
C:\>xsd webSearch.xsd /CLASSES /language:cs
Microsoft (R)-Unterstützungsprogramm für XML-Schemas oder Datentypen
[Microsoft (R) .NET Framework, Version 2.0.50727.42]
Copyright (C) Microsoft Corporation. All rights reserved.
Datei ‘C:\webSearch.cs’ wird geschrieben
Nun haben wir eine Klassendatei, die wir benutzen können um das XML-Objekt ohne Exception deserialisieren zu können. Mit folgenden Code kann man dann eine einfache Ausgabe des Objektes bewerkstelligen.
using System;
using System.Collections.Generic;
using System.Text;
namespace XSDTest
{
class Program
{
static void Main(string[] args)
{
System.IO.StreamReader str = new System.IO.StreamReader(“webSearch.xml”);
System.Xml.Serialization.XmlSerializer xSerializer = new System.Xml.Serialization.XmlSerializer(typeof(ResultSet));
ResultSet res = (ResultSet) xSerializer.Deserialize(str);
foreach (ResultSetResult r in res.Result)
{
Console.WriteLine(r.Title);
Console.WriteLine(r.Summary);
Console.WriteLine();
}
str.Close();
Console.ReadLine();
}
}
}
Die Ausgabe sieht dann wie folgt aus:
XML Class Generator for C++
Oracle9i XML Developer’s Kits Guide - XDK. Release 2 (9.2) Part Number A96621-01
. 19. XML Class Generator for C++ This chapter contains the following sections:
Accessing XML C++ Class Generator … Accessing XML C++ Class Generator. The XML
C++ Class Generator is provided with Oracle9i and is also available for …
XML Class Generator for Java
Oracle9i XML Developer’s Kits Guide - XDK. Release 2 (9.2) Part Number A96621-01
. 7. XML Class Generator for Java. This chapter contains the following sections:
Accessing XML Class Generator for Java … The Oracle XML Class Generator for J
ava is provided with Oracle9i’s XDK for Java …
Permalink (0 Kommentare) Kommentieren
Konvertierung von ANSI String nach UTF-8 und URL Encoded String
////////////////////////////////////////////////////////////////
// Converting CString to UTF-8
char m[MAXBUFFERLEN] = {0};
WCHAR w[MAXBUFFERLEN] = {0};
CString osUTF8String;
int erg = 0;
strcpy(m, m_osSalesOrderXML);
erg = MultiByteToWideChar(CP_ACP, 0, m, -1, w, sizeof(w) / sizeof(WCHAR));
erg = WideCharToMultiByte(CP_UTF8, 0, w, -1, m, sizeof(m), 0, 0);
osUTF8String = m;
////////////////////////////////////////////////////////////////
CString EncodeCStr2URLEncoded(CString str) {
int len = str.GetLength();
char* buff = new char[len + 1];
strcpy(buff, str);
CString ret = "";
for(int i=0;i<len;i++) {
if(isOrdinaryChar(buff[i])) {
ret = ret + buff[i];
}else if(buff[i] == ' ') {
ret = ret + "+";
}else {
char tmp[4];
sprintf(tmp, "%%%02x", (unsigned char) buff[i]);
ret = ret + tmp;
}
}
delete[] buff;
return ret;
} // EncodeCStr2URLEncoded
////////////////////////////////////////////////////////////////
bool isOrdinaryChar(char c) {
char ch = tolower(c);
if(ch == 'a' || ch == 'b' || ch == 'c' || ch == 'd' || ch == 'e'
|| ch == 'f' || ch == 'g' || ch == 'h' || ch == 'i' || ch == 'j'
|| ch == 'k' || ch == 'l' || ch == 'm' || ch == 'n' || ch == 'o'
|| ch == 'p' || ch == 'q' || ch == 'r' || ch == 's' || ch == 't'
|| ch == 'u' || ch == 'v' || ch == 'w' || ch == 'x' || ch == 'y'
|| ch == 'z' || ch == '0' || ch == '1' || ch == '2' || ch == '3'
|| ch == '4' || ch == '5' || ch == '6' || ch == '7' || ch == '8'
|| ch == '9') {
return true;
}
return false;
} // isOrdinaryChar
Und hier der umgekehrte Weg UTF-8 nach ANSI String:
////////////////////////////////////////////////////////////////
// Converting UTF-8 to ANSI
CString osAnsiString;
char m[MAXBUFFERLEN] = {0};
WCHAR w[MAXBUFFERLEN] = {0};
int erg = 0;
strcpy(m, m_osReceivedXML);
erg = MultiByteToWideChar(CP_UTF8, 0, m, -1, w, sizeof(w) / sizeof(WCHAR));
erg = WideCharToMultiByte(CP_ACP, 0, w, -1, m, sizeof(m), 0, 0);
m_osAnsiString = m;
// Converting CString to UTF-8
char m[MAXBUFFERLEN] = {0};
WCHAR w[MAXBUFFERLEN] = {0};
CString osUTF8String;
int erg = 0;
strcpy(m, m_osSalesOrderXML);
erg = MultiByteToWideChar(CP_ACP, 0, m, -1, w, sizeof(w) / sizeof(WCHAR));
erg = WideCharToMultiByte(CP_UTF8, 0, w, -1, m, sizeof(m), 0, 0);
osUTF8String = m;
////////////////////////////////////////////////////////////////
CString EncodeCStr2URLEncoded(CString str) {
int len = str.GetLength();
char* buff = new char[len + 1];
strcpy(buff, str);
CString ret = "";
for(int i=0;i<len;i++) {
if(isOrdinaryChar(buff[i])) {
ret = ret + buff[i];
}else if(buff[i] == ' ') {
ret = ret + "+";
}else {
char tmp[4];
sprintf(tmp, "%%%02x", (unsigned char) buff[i]);
ret = ret + tmp;
}
}
delete[] buff;
return ret;
} // EncodeCStr2URLEncoded
////////////////////////////////////////////////////////////////
bool isOrdinaryChar(char c) {
char ch = tolower(c);
if(ch == 'a' || ch == 'b' || ch == 'c' || ch == 'd' || ch == 'e'
|| ch == 'f' || ch == 'g' || ch == 'h' || ch == 'i' || ch == 'j'
|| ch == 'k' || ch == 'l' || ch == 'm' || ch == 'n' || ch == 'o'
|| ch == 'p' || ch == 'q' || ch == 'r' || ch == 's' || ch == 't'
|| ch == 'u' || ch == 'v' || ch == 'w' || ch == 'x' || ch == 'y'
|| ch == 'z' || ch == '0' || ch == '1' || ch == '2' || ch == '3'
|| ch == '4' || ch == '5' || ch == '6' || ch == '7' || ch == '8'
|| ch == '9') {
return true;
}
return false;
} // isOrdinaryChar
Und hier der umgekehrte Weg UTF-8 nach ANSI String:
////////////////////////////////////////////////////////////////
// Converting UTF-8 to ANSI
CString osAnsiString;
char m[MAXBUFFERLEN] = {0};
WCHAR w[MAXBUFFERLEN] = {0};
int erg = 0;
strcpy(m, m_osReceivedXML);
erg = MultiByteToWideChar(CP_UTF8, 0, m, -1, w, sizeof(w) / sizeof(WCHAR));
erg = WideCharToMultiByte(CP_ACP, 0, w, -1, m, sizeof(m), 0, 0);
m_osAnsiString = m;
Permalink (0 Kommentare) Kommentieren