2012-06-19 7 views
2

Я использую XMLReader в C# .net 4.0 для поиска небольшого фрагмента XML. Я хочу найти определенные элементы в XML, и я использую метод XMLReader.ReadToFollowing("name") для поиска элементов. Я не знаю порядка в XML-документе, который содержит эти элементы; они находятся в последовательности различий или вообще отсутствуют. Приказ не имеет значения для меня, но я выброшу исключение, если элемент отсутствует.C# XML Parsing - Поиск определенных элементов

XMLReader только вперед, поэтому, если первый элемент, который я ищу, является последним значением в документе XML, дополнительные чтения не будут выполнены.

Я думал о создании нового XMLReader для каждого поиска. У меня есть только небольшой набор элементов для поиска, и XML не огромен, поэтому я не думаю, что будет много накладных расходов, но я могу ошибаться.

Есть ли лучшая библиотека для поиска XML, когда вы не знаете порядок элементов? Или это отсутствие порядка в XML - нарушение спецификации XML?

В частности, допустим, у меня есть простой XML. Голова и 10 детей.

<sometag> 
    <element1>data</element1> 
    <element2>data</element2> 
    . 
    . 
    . 
    <element10>data</element10> 
</sometag> 

Было бы неэффективно открывать 5 XMLReaders, чтобы найти эти элементы? Я мог бы также использовать одного читателя и проходить через каждый элемент, но тогда мне нужно будет отслеживать, какие элементы я нашел.

+0

Если у вас есть образец XML, есть несколько способов сделать это. Я уверен, что многие люди будут рады опубликовать некоторые конкретные примеры - я знаю, что буду! Другие способы, которыми вы могли бы подходить к этому, - использовать синтаксический анализ на основе DOM через XmlDocument и XPath - http://msdn.microsoft.com/en-us/library/system.xml.xmldocument или более современный класс XDocument - http: // msdn .microsoft.com/en-us/library/system.xml.linq.xdocument.aspx – dash

ответ

4

Вместо XMLReader вы можете использовать XDocument (linq2xml), сделать это быстро и легко (по Element методом):

var doc = XDocument.Load(xmlFilePath); 
var element1 = doc.Element(searchItemName); 
if (element1 == null) throw ... 
... 
return ....; 

Вы можете назвать это столько времени, сколько вы хотите без перезагрузки файла XML.

+0

Считаете ли вы, что накладные расходы на создание XDocument больше, чем открытие 5 XMLReaders? Где, по вашему мнению, открытие $ Y XMLReaders будет медленнее, чем XDocument, или нет действительно большой разницы? – Rastapopulous

+0

@Rastapopulous, я сам тестирую его, в любом случае лучше научиться работать с xdocument и linq, потому что слишком легко делать что-либо с файлами xml, которые были сложны с другими компонентами xml, здесь, когда ваш файл мал, нет производительности разница, но код действительно прост, обслуживание проще, а скорость разработки действительно быстрее. –

0

Попробуйте использовать XPath. Он намного быстрее и не чувствителен к порядку элементов (только иерархия).

MSDN Документация: http://msdn.microsoft.com/en-us/library/ms256086.aspx

Программирование с использованием XPath требует немного обучения. И если ваш XML указывает пространство имен, вам обязательно нужно включить его в запрос XPath.

0

У вас есть .NET 4.0, поэтому используйте Linq для XML.

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