2017-10-01 13 views
1

XMLリーダーは、空の要素の周りの空白に敏感なようです。要素間の空白に関する感覚的なXmlReader

スペースがない空の要素(<B />)がある場合、リーダーはそれを要素として表示しません。

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(); 
} 

NodeTypeの値を印刷すると、表示されているように見えます。ここで私は私たちのために、見つかったタイプ(マイナス上記のif文)を印刷しています:

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 

問題は文であるように思わ:

reader.ReadElementContentAsString() 

私はその文を削除する場合は、私が手Bが再び表示されます。私はそれがその方法と関係して、readerを次のノード(?)に移動させると思っていましたが、それを証明するか、回避することができません。

XmlReaderの空ノードをどのように処理すればよいですか?それはスペースなしバージョンに空要素<B />とスペースとバージョンのテキストノード上に位置するようにコードで

+0

[XmlReader - 改行のないxmlファイルの読み込み問題](https://stackoverflow.com/q/7196468/3744182)と[なぜ他のすべての要素を読み込むのですか?](https: //stackoverflow.com/q/10038193/3744182)。 – dbc

+0

また、[c#XMLReaderはReadElementContentAsを使用した後にノードをスキップします](https://stackoverflow.com/a/24991311/3744182)。 – dbc

答えて

0

は、ReadElementContentAsString</A>の端過去リーダーを進めます。制御は、whileループの先頭にある文の式へと進みます。これにより、読者はそれを越えて効果的にスキップします。したがって、本体の中でReadElementContentAsStringが呼び出された場合、reader.Read()がループの先頭で呼び出されないようにロジックを変更する必要があります。

関連する問題