2017-10-01 3 views
1

Le lecteur XML semble être sensible à l'espace blanc autour des éléments vides.XmlReader sensible aux espaces entre les éléments

Si j'ai un élément vide sans espaces (<B />) alors le lecteur ne le voit pas comme un élément.

public static void Main() 
{ 
    WriteLine("No spaces around <B>."); 
    using (var stringReader = new StringReader(@"<Index><A>a</A><B /><C>c</C></Index>")) 
    using (var reader = XmlReader.Create(stringReader)) 
    { 
     while (reader.Read()) 
     { 
      if (reader.Name != "Index" && reader.NodeType == XmlNodeType.Element) 
      { 
       WriteLine("{0}: {1}", reader.Name, reader.ReadElementContentAsString()); 
      } 
     } 
    } 
    WriteLine(); 
    WriteLine("Spaces added around <B>."); 
    using (var stringReader = new StringReader(@"<Index><A>a</A> <B /> <C>c</C></Index>")) 
    using (var reader = XmlReader.Create(stringReader)) 
    { 
     while (reader.Read()) 
     { 
      if (reader.Name != "Index" && reader.NodeType == XmlNodeType.Element) 
      { 
       WriteLine("{0}: {1}", reader.Name, reader.ReadElementContentAsString()); 
      } 
     } 
    } 

    Read(); 
} 

L'impression des valeurs donne l'impression de le voir. Ici, je suis l'impression de nos types trouvés dans l'ordre (moins l'instruction if ci-dessus):

No spaces around <B>.  Spaces added around <B>. 
    Index: Element   Index: Element 
     A: Element    A: Element 
      : Text     : Text 
     A: EndElement   A: EndElement 
     B: Element    : Whitespace 
     C: Element    B: Element 
      : Text     : Whitespace 
     C: EndElement   C: Element 
    Index: EndElement   : Text 
           C: EndElement 
          Index: EndElement 

Le problème semble être avec l'énoncé:

reader.ReadElementContentAsString() 

Si je retire cette déclaration je reçois B apparaissant à nouveau. Je pensais que cela pourrait être quelque chose à faire avec cette méthode en déplaçant le reader au nœud suivant (?) Mais je n'arrive pas à le prouver ou à le contourner. Comment gérer les nœuds vides avec le XmlReader?

+0

Ressemble à une copie de [XmlReader - problème de lecture du fichier xml sans saut de ligne] (https://stackoverflow.com/q/7196468/3744182) et [Pourquoi mon lecteur XML lit-il tous les autres éléments?] (Https: //stackoverflow.com/q/10038193/3744182). – dbc

+0

Et aussi [C# XMLReader ignore les nœuds après l'utilisation de ReadElementContentAs] (https://stackoverflow.com/a/24991311/3744182). – dbc

Répondre

0

Dans votre code, ReadElementContentAsString avance le lecteur passé la fin de </A>, de sorte qu'il est positionné sur l'élément vide <B /> dans la version sans espaces et le noeud texte dans la version avec des espaces. Le contrôle passe à l'expression-instruction reader.Read() dans la tête de la boucle while, ce qui fait progresser le lecteur et l'ignore. Vous devez donc modifier la logique pour que reader.Read() ne soit pas appelée dans la tête de votre boucle si ReadElementContentAsString est appelée dans le corps.