У меня есть простой xml
<data>
<node1>value1</node1>
<node2>value2</node2>
</data>
Я использую IXmlSerializable для чтения и записи такого xml с DTO.Следующий код работает просто отлично
XmlReader reader;
...
while( reader.Read() ){
Console.Write( reader.ReadElementContentAsString() );
}
// outputs value1value2
Однако, если пропущены пробелы в xml, т.е.
<data>
<node1>value1</node1><node2>value2</node2>
</data>
или я использую XmlReaderSettings.IgnoreWhitespace = true;
, код выводит только «значение1», игнорируявторой узел.Когда я печатаю узлы, через которые проходит анализатор, я вижу, что ReadElementContentAsString
перемещает указатель на EndElement
из node2
, но я не понимаю, почему это должно происходить или как это исправить.
Это возможная ошибка реализации XML-парсера?
==============================================
Вот пример кода и 2 примера xml, которые дают разные результаты
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>
с использованием (1) отпечатков
Element node-1 value1
Element node-2 value2
с использованием (2) отпечатков
Element node-1 value1