![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
Привет всем. Кто может помочь с такой проблемой?
....есть программа на C++. В некоторой строке содержится содержимое XML документа, т.е. char* xmlText = "<?xml version=\"1.0\"?><root>..... "; нужно преобразовать данную строку с помощью имеющегося xsl. Но msxsl.exe может принимать исходные данные только из файла, либо со стандартного ввода. Вопрос в том - как можно передать эти данные из строки? Понятно, что можно сделать временный файл tmp.xml, туда записать xmlText,а затем сделать вызов наподобие следующего: WinExec("msxsl.exe -tmp.xml - myxsl.xsl -o result.xml"); ...а потом удалить tmp.xml. Но мне это кажется как-то криво. Еще интересно, можно ли результат получить тоже в виде строки? |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
А прямо и не получиться, пока не избавишься от msxsl и не напишешь свою программу, а также не изменишь способ хранения xml документа. Выход я вижу таким: - качаем libxml2 и курим исходники xsltproc (аналог msxsl для linux) - берем свой .cpp файл с xmlем, подключаем к нему libxml2, делаем преобразование, генерим строку и записываем в новый .cpp файл. А вообще я так и не понял задачу до конца. Это было бы логично только если есть сотни-тысячи cpp файлов с такими xmlями, или сотни-тысячи строк в одном файле с xmlText1, xmlText2...xmlText10000. Это сообщение отредактировал(а) SABROG - 5.12.2007, 17:05 |
|||
|
||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
задача такая: есть cgi приложение на C++. Весь результат работы приложения собирается в одной строке вроде xmlText, затем строка подается на стандартный вывод. xmlText сейчас содержит ссылку на файл xsl. Естествнно преобразование в этом случае происходит на стороне клиента (клиент в специальном диалоговом окне будет указывать путь к xsl файлу). Задача сделать это преобразование на стороне сервера.
...xml документ вообще нигде не хранится я не понимаю почему вы меня не понимаете, ведь xmlText содержит не статические данные, а для каждого запроса имеет свое содержимое. а где можно взять libxml2, мне для винды нужно естественно Это сообщение отредактировал(а) zmejg - 5.12.2007, 17:36 |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Наверно потому, что я не нашел в первом посте слово CGI. Ну раз программа ваша, то проблемы не вижу, libxml2 кросплатформенный. Собирается через gcc, msvc и mingw.
Может быть есть смысл поработать с msxml.dll, не знаю есть ли там методы для работы с xsl преобразованием. Не люблю поделки мелкософта. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
msxsl это демо программа - врапер над MSXML ActiveX компонентом. Ее исходники есть на сайте MS (в MSDN), только они там хитро закопанны, удалось найти только через google :( Берешь исходники, правишь под свои нужды или зовешь MSXML напрямую. |
|||
|
||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
скажите, как нужно компилировать все это добро?
и какие именно изменения и куда нужно вносить? |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
nmake
Main находится в файле main.cxx (как ни странно ![]() Разбор коммандной строки находится в файлах cmdline.cxx/hxx Собственно преобразование - в файле transfrm.cxx Имена файлов: Входной - _bstrInput Шаблон - _bstrStylesheet Выходной - _bstrOutput Файловые потоки содержатся в файлах seqstrm.cxx/hxx Можно заменить реализацию файловых потоков, что бы они читали строки из памяти, в качестве имени файла они будут принимать указатели на строки (в текстовом виде) Функцию main надо переименовать во что-нибудь отличное от main Функцию mainCRTStartup - убрать. В функции HRESULT ParseCommandLine::Parse() {return Parse(GetCommandLineW());} - GetCommandLineW заменить на свою коммандную строку (приготовленную в памяти) и позвать бывшую main. Да, всю эту бодягу прилинковать к своей программе |
||||
|
|||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
а как пользоваться nmake?
я понимаю что есть такие вещи как google, msdn и т.д... но так слишком сложно искать что-то конкретное. Может в двух словах напишете как собирать проекты с помощью make файлов |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Заходишь в директорию с сорцами, убеждаешься, что у тебя настроенны пути на VC, набираешь nmake Если хочешь более подробно - загляни в makefile (файл такой, в директории с сорцами) |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
такое ощущение, что этого никто не заметил если использовать CreateProcess, перенаправить стандартный ввод на что угодно не составляет большой проблемы... -------------------- qqq |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Можно, конечно, CreatePipe сделать, но это не правильный выход из ситуации. Это все-равно что принимать данные через SMS, мобильный телефон положить на сканнер, а FineReader будет расшифровывать, а плагин для FineReader'a обрабатывать.
|
|||
|
||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
видимо двух слов недостаточно...
в командной строке в директории msxslsrc пишу : C:\>msxslsrc> nmake.exe makefile ...и ничего не происходит. А что должно быть? Как скомпилировать исходный проект хотя бы для начала без моих изменений? |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
что значит ничего не происходит?? тупо черный экран и мигающий курсор чтоли? и вообще НИЧЕГО?
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
zmejg |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 18.7.2007 Репутация: нет Всего: нет |
написано что-то вроде:
makefile is up-to-date ...что это означает? |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
makefile здесь лишний, надо просто nmake без параметров
Это значит, что ты сказал nmake, что хочешь собрать makefile, и nmake сообщил, что makefile вполне новый - нет никаких новых файлов, от которых бы он зависел. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |