2009-01-14 3 views
0

У меня есть файл журнала, содержащий сотни/тысячи отдельных XML-сообщений, и вам нужно найти способ извлечь полное XML-сообщение в зависимости от заданных параметров (значения узлов).Извлечь определенное XML-сообщение из файла журнала

Моя самая большая проблема заключается в том, что, хотя я программирую справедливую сумму, у меня был очень небольшой контакт с XML или XML-библиотеками языков, которые я использую, и не думал, что простой синтаксический анализ будет элегантным решением!

Я собираюсь попробовать это на C# или VB.net, любая помощь будет очень признательна и любая попытка решения еще лучше!

благодарит заранее!

ответ

0

очень простой подход будет заключаться в следующем:

  1. Разбирает файл. Вы можете извлечь каждое сообщение Xml и рассматривать его как один полный документ.
  2. На основе параметров запросите xml и определите, является ли это совпадением.

Это решение не является самым большим, я бы поставил пари, что он будет работать плохо, поскольку вы будете загружать довольно много, хотя только тестирование будет известно. Этот подход имеет преимущество в том, что файл не должен быть действительным Xml. Поэтому, если ваш синтаксический анализ файла будет записан, вы сможете использовать этот метод. (Я предполагаю, что ваш регистратор просто добавляет xml в файл и не рассматривает это как один большой dom).

Если файл также не записывается, и в зависимости от размера вы можете обернуть содержимое файла в узле Xml. Снова это предполагает, что единственное, что записано в файле, это Xml. Если вы регистрируете дополнительную информацию, вам придется перейти к первому решению.

Что касается разбора Xml, у вас есть различные варианты, такие как Linq to Xml или XPath.

3

EDIT: нижеприведенный ответ предполагает, что весь файл журнала является допустимым XML-документом. Игнорируйте, если это не так.

XPath - это, вероятно, ваш ответ здесь - если вы можете позволить себе загрузить весь файл журнала за один раз, он должен быть довольно прост в использовании XmlNode.SelectSingleNode или XNode.XPathSelectElement.

В качестве альтернативы, если вы используете LINQ to XML, вы можете построить запрос LINQ - это может быть более читаемым, если вы не знакомы с XPath.

Если вы хотите узнать XPath, я обычно нашел урок W3Schools довольно хорошим.

0

Для LINQ к XML, что-то похожее на это:

Dim xml As XDocument = XDocument.Load("Messages.xml") 
Dim messages = From msg In xml.<Messages>.<Message> Select msg 

For Each m In messages 
    Console.WriteLine(m.Value.ToString) 
Next 

Конечно, для этого придется модифицировать, чтобы соответствовать структуре вашей XML.

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