2009-08-31 8 views
2

Je désérialise le fichier XML suivant. Utilisation du sérialiseur XML avec VSTS 2008 + C# + .Net 3.5.Echec de la désérialisation XML

Voici le fichier XML.

<?xml version="1.0" encoding="utf-8"?> 
<Person><Name>=b?olu</Name></Person> 

Voici la capture d'écran pour l'affichage du fichier XML et le format binaire du fichier XML,

alt text http://i25.tinypic.com/e7i844.jpg

alt text http://i25.tinypic.com/23wjnev.jpg

S'il y a des solutions pour accepter ces caractères , ce sera génial! Puisque mon fichier XML est grand, et si de tels caractères sont vraiment invalides et doivent être filtrés, je veux garder le contenu restant du fichier XML après la désérialisation.

Actuellement, la désérialisation XML échoue avec InvalidOperationException et toute l'information du fichier XML est perdue.

En fait, lors de l'ouverture de ce fichier XML dans VSTS, il y a une erreur comme celle-ci, Erreur 1 Caractère '?', La valeur hexadécimale 0xffff est illégale dans les documents XML. Je suis confus car dans la forme binaire, il n'y a pas de valeurs 0xffff.

Des solutions ou des idées?

EDIT1: voici mon code qui est utilisé pour désérialiser fichier XML,

static void Foo() 
    { 
     XmlSerializer s = new XmlSerializer(typeof(Person)); 
     StreamReader file = new StreamReader("bug.xml"); 
     s.Deserialize(file); 
    } 

public class Person 
{ 
    public string Name; 
} 
+2

Pourriez-vous également publier le code que vous utilisez pour désérialiser le fichier XML? –

+0

Publié, d'autres idées? :-) – George2

+0

George, publie toujours l'exception complète: la sortie de ex.ToString(). –

Répondre

1

cette aide de style?

<name> 
    <![CDATA[ 
    =b?olu 
    ]]> 
</name> 

Ceci ou encoding devrait faire l'affaire.

EDIT: trouvé cette page: http://www.eggheadcafe.com/articles/system.xml.xmlserialization.asp. Plus précisément, ce code pour désérialisation:

public Object DeserializeObject(String pXmlizedString) 
{ 
    XmlSerializer xs = new XmlSerializer(typeof(Automobile)); 
    MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlizedString)); 
    XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); 
    return xs.Deserialize(memoryStream); 
    } 

Cette partie de "StringToUTF8ByteArray" et "Encoding.UTF8" regard étrangement absent de la vôtre. Je suppose que .NET n'aime pas lire l'encodage de votre fichier XML réel ...?

+0

Merci Glenn, le problème est le fichier XML est mon entrée de l'application, je ne peux pas le modifier en aucune façon. Je dois trouver un moyen de filtrer les caractères invalides et continuer à analyser (désérialiser) ceux qui restent. S'il y a des moyens d'accepter de tels caractères, ce sera plus grand! – George2

+1

On dirait que vous avez besoin d'un analyseur SAX (http://stackoverflow.com/questions/127869/sax-vs-xmltextreader-sax-in-c), ou vous devez pré-traiter le XML vous-même et dépouiller/encoder caractères problématiques avec regex ou similaire. Vous pourriez avoir à creuser autour d'un exemple regex. Je ne suis pas assez familier avec ça pour en donner un ici. – Glenn

+1

Ah oui, même avec un analyseur syntaxique SAX, vous devez toujours désinfecter les caractères. Donc vous pourriez avoir à le surcharger. – Glenn

1

Avez-vous essayé le DataContractSerializer à la place? J'ai rencontré une situation intéressante, quand quelqu'un copiait et collait un mot ou excelle des choses dans mon application Web: la chaîne contenait des caractères de contrôle invalides (comme l'onglet vertical). À ma grande surprise, cela a été sérialisé lors de l'envoi à un service WCF et même relire 100% original en le demandant. L'environnement .net pur n'a pas eu de problème avec cela, donc je suppose que DataContractSerializer peut gérer de telles choses (ce qui est à mon humble avis une violation de la spécification XML, cependant).

Nous avons eu un autre client Java accédant au même service - il a échoué lors de la réception de cet enregistrement ...

[Editer après format laid dans mon commentaire ci-dessous]

Essayez ceci:

DataContractSerializer serializer = new DataContractSerializer(typeof(MyType)); 
using (XmlWriter xmlWriter = new XmlTextWriter(filePath, Encoding.UTF8)) 
{ 
    serializer.WriteObject(xmlWriter, instanceOfMyType); 
} 
using (XmlReader xmlReader = new XmlTextReader(filePath)) 
{ 
    MyType = serializer.ReadObject(xmlReader) as MyType; 
} 

Le commentaire du second Marc est sur le point habitude de DataContractSerializers faire XmlElements au lieu de XmlAttributes:

<AnElement>value</AnElement> 

au lieu de

<AnElement AnAttribute="value" /> 
+0

Mais je n'utilise pas WCF, puis-je utiliser DataContractSerializer? – George2

+1

Bien sûr que vous pouvez, il suffit de lire la documentation. C'est très facile! – Dabblernl

+1

Tant que les données n'impliquent pas d'attributs ... –

0

Les "caractères non valides" semblent être des caractères Unicode codés. Peut-être que l'encodage erroné est utilisé?

Pouvez-vous demander aux auteurs de ce document quel caractère ils signifiait à inclure à cet emplacement? Peut-être leur demander comment ils ont généré le document?

Questions connexes