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 />
とスペースとバージョンのテキストノード上に位置するようにコードで
[XmlReader - 改行のないxmlファイルの読み込み問題](https://stackoverflow.com/q/7196468/3744182)と[なぜ他のすべての要素を読み込むのですか?](https: //stackoverflow.com/q/10038193/3744182)。 – dbc
また、[c#XMLReaderはReadElementContentAsを使用した後にノードをスキップします](https://stackoverflow.com/a/24991311/3744182)。 – dbc