По моему опыту XmlReader
очень легко случайно прочитать слишком много. Я знаю, что вы сказали, что хотите прочитать это как можно быстрее, но пытались ли вы использовать модель DOM? Я обнаружил, что LINQ to XML упрощает работу XML на намного .
Если ваш документ особенно большой, вы можете объединить XmlReader
и LINQ to XML, создав XElement
из XmlReader
для каждого из ваших «внешних» элементов в потоковом режиме: это позволяет вам выполнять преобразование работает в LINQ to XML, но в любой момент времени требуется только небольшая часть документа в памяти. Вот пример кода (немного адаптированный из этого блога ):
static IEnumerable<XElement> SimpleStreamAxis(string inputUrl,
string elementName)
{
using (XmlReader reader = XmlReader.Create(inputUrl))
{
reader.MoveToContent();
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == elementName)
{
XElement el = XNode.ReadFrom(reader) as XElement;
if (el != null)
{
yield return el;
}
}
}
}
}
}
Я использовал это для преобразования пользовательских данных StackOverflow (которые огромны) в другой формат раньше - это работает очень хорошо.
РЕДАКТИРОВАТЬ из радарбоба, переформатированный Джоном - хотя не совсем понятно, к какой проблеме «читать слишком далеко» относится ...
Это должно упростить вложение и решить проблему «слишком большое чтение».
using (XmlReader reader = XmlReader.Create(inputUrl))
{
reader.ReadStartElement("theRootElement");
while (reader.Name == "TheNodeIWant")
{
XElement el = (XElement) XNode.ReadFrom(reader);
}
reader.ReadEndElement();
}
Это решает проблему «чтения слишком далеко», потому что она реализует классический шаблон while:
initial read;
(while "we're not at the end") {
do stuff;
read;
}