powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск значения в XML
12 сообщений из 12, страница 1 из 1
Поиск значения в XML
    #33740944
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. У меня есть файл XML вот в таком виде:

<main>
- <id382>
<russian>Счет отнесения затрат по начисленной заработной плате</russian>
<english>////////////////////////////////</english>
<azeri>Щесабланмыш ямяк щаггы цзря хярълярин аид едилмяси щесабы</azeri>
</id382>
- <id469>
<russian>б) пособие в связи с трудовым увечьем и профессиональным заболеванием</russian>
<english>b) return of benefits for work-related injuries and professional diseases</english>
<azeri>б) ямяк задяси вя пешя хястялийи цзря мцавинятлярин гайтарылмасы</azeri>
</id469>
</main>

Есть также функция, которая ищет в ней значений.

MyXMLDoc->DocumentElement->ChildNodes->FindNode(Id)->ChildNodes->Nodes[lan-1]->NodeValue

Но насколько я знаю, данный файл не очень красив и не отвечает возможностям XML

Хочу переделать его в форму:

<main>
- <L id="382">
<russian>Счет отнесения затрат по начисленной заработной плате</russian>
<english>////////////////////////////////</english>
<azeri>Щесабланмыш ямяк щаггы цзря хярълярин аид едилмяси щесабы</azeri>
</L>
- <L id="469">
<russian>б) пособие в связи с трудовым увечьем и профессиональным заболеванием</russian>
<english>b) return of benefits for work-related injuries and professional diseases</english>
<azeri>б) ямяк задяси вя пешя хястялийи цзря мцавинятлярин гайтарылмасы</azeri>
</L>
</main>

и производить поиск по id.
С помощью каких функций можно производить поиск по значениям атрибутам?
Можно ли вообще так искать, или надо перебирать все узлы? Файл достаточно большой и приходится очень часто обращатся к фунции поиска значений.

Пишу на VC++ .Net. Использую MSXML.
Заранее спасибо.
...
Рейтинг: 0 / 0
Поиск значения в XML
    #33740980
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поиск по значениям атрибута можно проводить и так через SelectSingleNode или что-то в этом роде. Поиск по id будет эффективнее, но придётся явно объявлять, что это id, в doctype.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Поиск значения в XML
    #33741051
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Взял пример из MSDN, той функции, которую мне подсказали и попытался его совместить с примером из книги.



Сделал так: Создал проект MFC - диалоговое приложение

в файле stdafx.h записал

#import <msxml.dll> named_guids
using namespace MSXML;


А в обработчике события кнопки написал:

MSXML::IXMLDOMDocumentPtr XmlDocument;
MSXML::IXMLDOMElementPtr book;
MSXML::IXMLDOMElementPtr root;

::CoInitialize(NULL);
HRESULT hr = XmlDocument.CreateInstance(MSXML::CLSID_DOMDocument);
XmlDocument->load(S"booksort.xml");
root = XmlDocument->DocumentElement;
book=root->SelectSingleNode(S"descendant::book[author/last-name='Austen']");
//Change the price on the book.
book->LastChild->InnerText=S"15.95";
::CoUninitialize();


Компилятор выдает такую ошибку:
c:\Documents and Settings\User\My Documents\Visual Studio Projects\TestXML\TestXMLDlg.cpp(171): fatal error C1190: managed targeted code requires '#using <mscorlib.dll>' and '/clr' option

Вот сижу теряюсь в догадках??????
...
Рейтинг: 0 / 0
Поиск значения в XML
    #33741191
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если создаёшь манагед-приложение, придётся .net clr подрубать, о чём и написано. Ковыряй настройки, или подрубай слр или отключай управляемость.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Поиск значения в XML
    #33741222
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что за S перед строками стоят?
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Поиск значения в XML
    #33741380
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где же я использую управляемый код? Разве нельзя через импорт использовать функции работы с парсером? Я через импорт работал с Excel и там не нужно было использовать managed.

А S я и сам не знаю. Этот код взят из MSDN.
...
Рейтинг: 0 / 0
Поиск значения в XML
    #33741387
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как оказалось, компилятор ругался именно из-за этих S

После того как я их убрал, все скомпилировалось. Но возникла другая проблема

Код сейчас у меня следующий:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
             MSXML::IXMLDOMDocumentPtr XmlDocument;
	MSXML::IXMLDOMElementPtr book;
	MSXML::IXMLDOMElementPtr root;

	::CoInitialize(NULL);
	HRESULT hr = XmlDocument.CreateInstance(MSXML::CLSID_DOMDocument);    

	_bstr_t bFN;
	bFN = "c:\\testXML.xml";
            XmlDocument->load(bFN); 
	_bstr_t bCt;
	bCt = XmlDocument->xml;

	CString str = (LPCSTR)bCt;

	AfxMessageBox(str);

             root = XmlDocument->documentElement;
	_bstr_t bVal;
	bVal = "descendant::book[author/last-name='Austen']";
	book=root->selectSingleNode(bVal);

	::CoUninitialize();

Документ загружается, о чем свидетелствует AfxMessageBox(str);
Но вот на функции selectSingleNode программа вылетает в следующий кусок кода:
Код: plaintext
1.
2.
3.
4.
5.
inline IXMLDOMNodePtr IXMLDOMNode::selectSingleNode ( _bstr_t queryString ) {
    struct IXMLDOMNode * _result =  0 ;
    HRESULT _hr = raw_selectSingleNode(queryString, &_result);
    if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
    return IXMLDOMNodePtr(_result, false);//Здесь дает ошибку
}

В чем же может быть дело????
...
Рейтинг: 0 / 0
Поиск значения в XML
    #33742546
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и чего говорит?
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Поиск значения в XML
    #33742574
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот здесь return IXMLDOMNodePtr(_result, false);//Здесь дает ошибку

говорит следующее:

Unhandled exception at 0x7c81eb33 in TestXML.exe: Microsoft C++ exception: _com_error @ 0x0012f2d4.
...
Рейтинг: 0 / 0
Поиск значения в XML
    #33742709
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну дык отлавливай этот _com_error и отображай его описание.
зы странный у тебя дебагер.
зыы попробуй другой selectSingleNode воспользоваться, которай с двумя параметрами.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Поиск значения в XML
    #33743407
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoну дык отлавливай этот _com_error и отображай его описание.
зы странный у тебя дебагер.
зыы попробуй другой selectSingleNode воспользоваться, которай с двумя параметрами.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm


Спасибо, вам большое. Я разобрался оказывается надо было передавать параметр в следующем виде:
book[author/last-name='Austen']

Все заработало. Правда есть еще одно желание, хочу искать по аттрибутам.
Сейсас ищу так:

<lang>
<id>
1
</id>
<val>
Идф Идф Идф
</val>
</lang>

Сначала нахожу по id, а потом перебираю уже в найденном узле все его подузлы. Но хочеться иметь файл такой структуры

<lang id= "1">
<val>
Идф Идф Идф
</val>
</lang>

Как это можно реализовать, не подскажите?
...
Рейтинг: 0 / 0
Поиск значения в XML
    #33744973
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lang/@id='1'
может, следует подключать msxml3.dll ?
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск значения в XML
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]