2013-10-25 8 views
0

Как я могу эффективно получить узел XML из большого XML-файла?Получить XML-узел из большого XML-файла с помощью XmlReader?

В настоящее время у меня есть этот код для загрузки файла XML и получение NodeList. Это отлично работало, когда этот файл был небольшим (содержащим только этот узел). Однако, когда я объединить его с другим файлом XML, загрузкой, что новые случаи всего файла моего Windows Mobile устройство к сбою (из памяти)

XmlDocument xmlDocument = new XmlDocument(); 
xmlDocument.Load(configFile); 
XmlNodeList nodeList = xmlDocument.GetElementsByTagName("appsettings"); 

Моего XML является выглядит следующим образом (я хочу получить appsettings, который контролирует видимость кнопок в моем приложении):

<site> 
<settings> 
<appsettings> 
<add key="0" type="Home" value="True"/> 
<add key="1" type="About" value="False"/> 
<add key="2" type="Contact" value="True"/> 
</appsettings> 
........... 
</settings> 
</site> 

Как я могу найти этот узел с XmlReader и загрузить его в nodeList? Я пытался использовать

+0

Насколько велик полный XML-файл? –

+0

Это 13 МБ, у него есть некоторые данные для приложения, не связанные с тегом appsetting, но я должен иметь его там сейчас. – 22332112

+1

Почему вы не храните данные и настройки в отдельных файлах? – Reda

ответ

1

Вы должны использовать XmlReader. Что-то вроде:

using (var reader = XmlReader.Create("file://path/to/file")) 
{ 
    reader.ReadToDescendant("appsettings"); 
    while (reader.Read() && reader.Name == "add") 
    { 
    yield return new 
     { 
     Key = reader.GetAttribute("key"), 
     Type = reader.GetAttribute("type"), 
     Value = reader.GetAttribute("value") 
     }; 
    } 
} 
+0

Спасибо. Мне просто нужно было установить IgnoreWhitespace в true. – 22332112

0

Вы пробовали LINQ to XML? (Старая модель тааак 40s: P)

может быть что-то вроде этого:

var xmlDoc = XDocument.Load(@"E:\Xml.xml"); 
var query = xmlDoc.Root.Element("settings").Descendants().First(); 

Мы знаем, что узел «AppSettings» всегда находятся на определенном уровне. Поэтому мы берем корень и запрос для узла настроек. Затем мы берем decsendants этого узла и берем первый из них. Что в данном случае является «appsettings».

Я знаю, что есть способ LINQ сделать это еще лучше, но это то, что я мог придумать из головы без визуальной студии или LINQPad.

Надеюсь, что это поможет.

Смежные вопросы