Я хорошо прочитал MSDN и вопросы, связанные с XmlReader, по StackOverflow, и я еще не сталкивался с приличным примером "передового опыта".
Я пробовал различные комбинации, и каждая из них кажетсяиметь недостатки, но лучшее, что я могу придумать, заключается в следующем:
XML:
<properties>
<actions:name>start</actions:name>
<actions:value type="System.DateTime">06/08/2011 01:26:49</actions:value>
</properties>
Код:
// Reads past the initial/root element
reader.ReadStartElement();
// Check we haven't hit the end
while (!reader.EOF && reader.NodeType != XmlNodeType.EndElement) {
if (reader.IsStartElement("name", NamespaceUri)) {
// Read the name element
this.name = reader.ReadElementContentAsString();
} else if (reader.IsStartElement("value", NamespaceUri)) {
// Read the value element
string valueTypeName = reader["type"] ?? typeof(string).Name;
Type valueType = Type.GetType(valueTypeName);
string valueString = reader.ReadElementContentAsString();
// Other stuff here that doesn;t matter to the XML parsing
} else {
// We can't do anything with this node so skip over it
reader.Read();
}
}
Это передаетсяв мой класс из вызова .ReadSubTree (), и каждый класс читает свою собственную информацию.Я бы предпочел, чтобы он НЕ полагался на то, что он находится в определенном порядке.
До этого я пробовал несколько вариантов.
1) while(reader.Read())
Это было взято из различных примеров, но найденочто он "пропустил" некоторые элементы, когда .ReadContent*()
элемента 1 оставил его в начале элемента 2, .Read
прочитал его поверх элемента 3.
2) Удаление .Read()
вызвало егопросто застрять после первого элемента, который я прочитал.
3) Несколько других, которые я долгое время отправлял в "fail".
Насколько я вижу, код, на котором я остановился, кажется,быть наиболее приемлемым и стабильным, но есть ли что-то очевидное, что мне не хватает?
(обратите внимание на тег c # 2.0, поэтому LINQ / XNode / XElement не являются опциями)