none
xml RRS feed

  • Вопрос

  • привет! вот решил как начинающий освоить работу с xml. как можно реализовать поиск по xml документу если он имеет много степеней "вложенности"? если можно то с примером, уж простите за наглость
    • Перемещено Tagore Bandlamudi 2 октября 2010 г. 22:13 MSDN Forums consolidation (От:Разработка Windows-приложений)
    10 ноября 2009 г. 20:51

Ответы

Все ответы

  • День добрый! 
    Мне все же кажется, что для начала Вам следует просто освоить работу с XML, а уже потом Вы сами поймете как организовать поиск в XML документе. Для начала следует, отметь два основных подхода к разбору XML документов:  DOM и SAX. Исходя из ваших предпочтений, Вы можете выбрать ту или иную библиотеку для работы с XML документами. Сделаем предположение, что Вы пишите на С++ (хотя может и нет). Тогда для примера можно выбрать библиотеку pugixml. Пример обхода всего дерева разбора XML документа:

    #include <string>
    #include <sstream>
    #include <iostream>
    
    #include "pugixml.hpp"
    #include "pugiconfig.hpp"
    
    using namespace std;
    using namespace pugi;
    
    int tabsize = 0;
    
    // Разбор элемента документа
    void showXML(xml_node node)
    {
       // Пробегаем циклом по всем дочерним элементам
       for(xml_node::iterator nodeChild = node.begin(); nodeChild != node.end(); ++nodeChild)
       {
          for(int itab = 0; itab < tabsize; itab++) // делаем красивый отступ =)
             cout << "   ";
          // Имя элемента
          cout << nodeChild->name() << endl;
          
          // Вывод всех атрибутов и их значений
          for(xml_node::attribute_iterator atr = nodeChild->attributes_begin(); atr != nodeChild->attributes_end(); ++atr)
          {
             for(int itab = 0; itab < tabsize; itab++) // делаем красивый отступ =)
                cout << "    ";
    
             cout << "Attribute Name: " << atr->name() << ", Attribute Value: " << atr->value() << endl;
          }
    
          // Рекурсивно для всех дочерних элементов
          tabsize++;              // Увеличить отступ для отображения
          showXML(*nodeChild);
          tabsize--;              // Уменьшить отступ для отображения
       }
    }
    
    int main(int argc, char** argv)
    {
       xml_document xml;
       xml.load_file("e:\\config.xml");
    
       xml_node nodeRoot = xml.root();
       showXML(nodeRoot);
    
       system("PAUSE");
       return 0;
    }
    
    Имея XML документ:
    <?xml version="1.0" encoding="utf-8"?>
    <Package Id="Proof.ru-ru" Type="MSI" Path="Proof.MSI" Version="1.0" Platform="x86">
    	<Feature Id="SpellingAndGrammarFilesExp1_1049" Cost="9990994">
    		<OptionRef Id="SpellingAndGrammarFiles_1049"/>
    	</Feature>
    	<Feature Id="Gimme_OnDemandData" Cost="0">
    		<OptionRef Id="Gimme_OnDemandData"/>
    	</Feature>
    	<Feature Id="ThesaurusFiles_1049" Cost="4218595">
    		<OptionRef Id="ThesaurusFiles_1049"/>
    	</Feature>
    	<Feature Id="MsoInstalledPackagesScopedIntl_1049" Cost="0">
    		<OptionRef Id="AlwaysInstalled"/>
    	</Feature>
    	<Feature Id="HyphenationFiles_1049" Cost="132884">
    		<OptionRef Id="HyphenationFiles_1049"/>
    	</Feature>
    	<Feature Id="OCR_1049" Cost="213556">
    		<OptionRef Id="OCR_1049"/>
    	</Feature>
    	<Feature Id="SetupControllerFiles" Cost="1131">
    		<OptionRef Id="AlwaysInstalled"/>
    	</Feature>
    	<Feature Id="SetupXmlFiles" Cost="1131">
    		<OptionRef Id="AlwaysInstalled"/>
    	</Feature>
    </Package>
    

    Получим вот такой результат работы:
    C:\XMLTest\Debug>XMLTest.exe
    Package
    Attribute Name: Id, Attribute Value: Proof.ru-ru
    Attribute Name: Type, Attribute Value: MSI
    Attribute Name: Path, Attribute Value: Proof.MSI
    Attribute Name: Version, Attribute Value: 1.0
    Attribute Name: Platform, Attribute Value: x86
       Feature
        Attribute Name: Id, Attribute Value: SpellingAndGrammarFilesExp1_1049
        Attribute Name: Cost, Attribute Value: 9990994
          OptionRef
            Attribute Name: Id, Attribute Value: SpellingAndGrammarFiles_1049
       Feature
        Attribute Name: Id, Attribute Value: Gimme_OnDemandData
        Attribute Name: Cost, Attribute Value: 0
          OptionRef
            Attribute Name: Id, Attribute Value: Gimme_OnDemandData
       Feature
        Attribute Name: Id, Attribute Value: ThesaurusFiles_1049
        Attribute Name: Cost, Attribute Value: 4218595
          OptionRef
            Attribute Name: Id, Attribute Value: ThesaurusFiles_1049
       Feature
        Attribute Name: Id, Attribute Value: MsoInstalledPackagesScopedIntl_1049
        Attribute Name: Cost, Attribute Value: 0
          OptionRef
            Attribute Name: Id, Attribute Value: AlwaysInstalled
       Feature
        Attribute Name: Id, Attribute Value: HyphenationFiles_1049
        Attribute Name: Cost, Attribute Value: 132884
          OptionRef
            Attribute Name: Id, Attribute Value: HyphenationFiles_1049
       Feature
        Attribute Name: Id, Attribute Value: OCR_1049
        Attribute Name: Cost, Attribute Value: 213556
          OptionRef
            Attribute Name: Id, Attribute Value: OCR_1049
       Feature
        Attribute Name: Id, Attribute Value: SetupControllerFiles
        Attribute Name: Cost, Attribute Value: 1131
          OptionRef
            Attribute Name: Id, Attribute Value: AlwaysInstalled
       Feature
        Attribute Name: Id, Attribute Value: SetupXmlFiles
        Attribute Name: Cost, Attribute Value: 1131
          OptionRef
            Attribute Name: Id, Attribute Value: AlwaysInstalled
    

    После того как Вы освоитесь в работе с той или иной библиотекой, думаю реализовать поиск вам не составит труда.

    Ссылки по теме:
    11 ноября 2009 г. 7:32
  • Дерзайте
    Linq to XML
    http://msdn.microsoft.com/ru-ru/library/bb387098.aspx
    11 ноября 2009 г. 8:00
  • Используйте XmlTextReader , на основе чего делайте поиск. Что вы понимаете под "Большая степень вложенности"? Может вам нужно Поиск строки в XQuery .
    • Предложено в качестве ответа dask.net 11 ноября 2009 г. 8:58
    • Помечено в качестве ответа Moiseev Stanislav 23 ноября 2009 г. 7:54
    11 ноября 2009 г. 8:10