c# des espaces problème avec XmlReader
J'ai un xml simple
<data>
<node1>value1</node1>
<node2>value2</node2>
</data>
Je suis en utilisant IXmlSerializable pour lire et écrire des données xml avec des Otd. Le code suivant fonctionne très bien
XmlReader reader;
...
while( reader.Read() ){
Console.Write( reader.ReadElementContentAsString() );
}
//outputs value1value2
Toutefois, si les espacements dans le xml sont supprimés, c'est à dire
<data>
<node1>value1</node1><node2>value2</node2>
</data>
ou j'utilise XmlReaderSettings.IgnoreWhitespace = true;
, le code affiche seulement "valeur1" ignorer le deuxième nœud. Lorsque j'imprime les nœuds qui l'analyseur de traverse, je peux voir que ReadElementContentAsString
déplace le pointeur vers le EndElement
de node2
, mais je ne comprends pas pourquoi cela devrait-il se passer ou comment résoudre le problème.
Est-il possible de parser XML de mise en œuvre de bug?
===============================================
Voici un exemple de code et 2 exemples de xml qui produisent des résultats différents
string homedir = Path.GetDirectoryName(Application.ExecutablePath);
string xml = Path.Combine( homedir, "settings.xml" );
FileStream stream = new FileStream( xml, FileMode.Open );
XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.IgnoreWhitespace = false;
XmlReader reader = XmlTextReader.Create( stream, readerSettings );
while( reader.Read() ){
if ( reader.MoveToContent() == XmlNodeType.Element && reader.Name != "data" ){
System.Diagnostics.Trace.WriteLine(
reader.NodeType
+ " "
+ reader.Name
+ " "
+ reader.ReadElementContentAsString()
);
}
}
stream.Close();
1.) settings.xml
<?xml version="1.0"?>
<data>
<node-1>value1</node-1>
<node-2>value2</node-2>
</data>
2.) settings.xml
<?xml version="1.0"?>
<data>
<node-1>value1</node-1><node-2>value2</node-2>
</data>
à l'aide de (1) imprime
Element node-1 value1
Element node-2 value2
à l'aide de (2) tirages
Element node-1 value1
Ok, [ce][1] explique le problème [1]: stackoverflow.com/questions/2299632/...
OriginalL'auteur scibuff | 2012-02-22
Vous devez vous connecter pour publier un commentaire.
Il arrive que
reader.Read()
lire le caractère espace blanc. En ignorant les espaces, la même instruction lire le deuxième élément ("gnam" un XML jeton), en effet, amener le pointeur de la node2 élément.Déboguer le
reader
propriétés avant et après les méthodes appelées dans vous exemple. Vérifier NodeType et Valeur propriétés. Donner également un chèque de MoveToContent méthode aussi, il est très utile.Lire la documentation de toutes les méthodes et propriétés, et vous finirez par apprendre XmlReader classe fonctionne, et comment vous l'utilisez à vos fins. Ici est le premier résultat google: il contient un exemple explicite.
J'ai fini jusqu'à la suivante (pas complète) modèle:
OriginalL'auteur Luca
Par la documentation sur IgnoreWhitespace, une nouvelle ligne n'est pas considérée comme négligeable.
XmlReaderSettings.IgnoreWhitespace
XmlReaderSettings.IgnoreWhitespace = true;
OriginalL'auteur deraj
Ce n'est pas aussi robuste que Luca réponse, mais j'ai trouvé le motif suivant utiles raisonnable "prévisibles" XML (variations dans les espaces et les valeurs uniquement). Considérer:
De manière plus générale, en remplacement de
reader.ReadElementContent*()
, utilisezreader.Read()
suivie parreader.ReadContent*()
.OriginalL'auteur Eric Patrick
Si vous voulez que le XmlReader ne lit pas les espaces, vous devez initialiser le XmlReader avec les paramètres comme suit:
ça marche pour moi dans un fichier xml de la structure que vous avez posté:
OriginalL'auteur merce_00