| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > использование MSXSL.exe (xsl - преобразователь) |
| Автор: zmejg 5.12.2007, 09:57 |
| Привет всем. Кто может помочь с такой проблемой? ....есть программа на 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 5.12.2007, 17:02 | ||
А прямо и не получиться, пока не избавишься от msxsl и не напишешь свою программу, а также не изменишь способ хранения xml документа. Выход я вижу таким: - качаем libxml2 и курим исходники xsltproc (аналог msxsl для linux) - берем свой .cpp файл с xmlем, подключаем к нему libxml2, делаем преобразование, генерим строку и записываем в новый .cpp файл. А вообще я так и не понял задачу до конца. Это было бы логично только если есть сотни-тысячи cpp файлов с такими xmlями, или сотни-тысячи строк в одном файле с xmlText1, xmlText2...xmlText10000. |
| Автор: zmejg 5.12.2007, 17:34 | ||
задача такая: есть cgi приложение на C++. Весь результат работы приложения собирается в одной строке вроде xmlText, затем строка подается на стандартный вывод. xmlText сейчас содержит ссылку на файл xsl. Естествнно преобразование в этом случае происходит на стороне клиента (клиент в специальном диалоговом окне будет указывать путь к xsl файлу). Задача сделать это преобразование на стороне сервера.
...xml документ вообще нигде не хранится я не понимаю почему вы меня не понимаете, ведь xmlText содержит не статические данные, а для каждого запроса имеет свое содержимое. а где можно взять libxml2, мне для винды нужно естественно |
| Автор: SABROG 5.12.2007, 17:45 |
| Наверно потому, что я не нашел в первом посте слово CGI. Ну раз программа ваша, то проблемы не вижу, libxml2 кросплатформенный. Собирается через gcc, msvc и mingw. Может быть есть смысл поработать с msxml.dll, не знаю есть ли там методы для работы с xsl преобразованием. Не люблю поделки мелкософта. |
| Автор: xvr 6.12.2007, 12:56 | ||
msxsl это демо программа - врапер над MSXML ActiveX компонентом. Ее исходники есть на сайте MS (в MSDN), только они там хитро закопанны, удалось найти только через google :( Берешь исходники, правишь под свои нужды или зовешь MSXML напрямую. |
| Автор: zmejg 6.12.2007, 17:00 |
| скажите, как нужно компилировать все это добро? и какие именно изменения и куда нужно вносить? |
| Автор: xvr 6.12.2007, 21:44 | ||||
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 15.12.2007, 10:47 |
| а как пользоваться nmake? я понимаю что есть такие вещи как google, msdn и т.д... но так слишком сложно искать что-то конкретное. Может в двух словах напишете как собирать проекты с помощью make файлов |
| Автор: xvr 15.12.2007, 11:22 | ||
Заходишь в директорию с сорцами, убеждаешься, что у тебя настроенны пути на VC, набираешь nmake Если хочешь более подробно - загляни в makefile (файл такой, в директории с сорцами) |
| Автор: SABROG 15.12.2007, 12:33 |
| Можно, конечно, CreatePipe сделать, но это не правильный выход из ситуации. Это все-равно что принимать данные через SMS, мобильный телефон положить на сканнер, а FineReader будет расшифровывать, а плагин для FineReader'a обрабатывать. |
| Автор: zmejg 15.12.2007, 16:50 |
| видимо двух слов недостаточно... в командной строке в директории msxslsrc пишу : C:\>msxslsrc> nmake.exe makefile ...и ничего не происходит. А что должно быть? Как скомпилировать исходный проект хотя бы для начала без моих изменений? |
| Автор: jonie 17.12.2007, 01:22 |
| что значит ничего не происходит?? тупо черный экран и мигающий курсор чтоли? и вообще НИЧЕГО? |
| Автор: zmejg 17.12.2007, 10:17 |
| написано что-то вроде: makefile is up-to-date ...что это означает? |
| Автор: xvr 17.12.2007, 12:59 | ||||
makefile здесь лишний, надо просто nmake без параметров
Это значит, что ты сказал nmake, что хочешь собрать makefile, и nmake сообщил, что makefile вполне новый - нет никаких новых файлов, от которых бы он зависел. |
| Автор: zmejg 17.12.2007, 23:24 |
| А сейчас что не так? C:\msxslsrc>nmake.exe получаю: "mc" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. NMAKE: fatal error U1077: 'C:\windows\system32\cmd.exe: return code '0x1' Stop. |
| Автор: xvr 18.12.2007, 15:53 | ||
Это означает, что в makefile'е для чего-то завется утилита mc. Что это за утилита и для чего завется я не в курсе. Насколько я помню, makefile там весьма не тривиальный, автор занимался уменьшением размера exe'ника (makefile'а сейчас под рукой нет, посмотреть не могу) Посмотрел - mc это Message Compiler. Должен быть в VS (у VS 2003 лежит в C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\Bin), убедись, что PATH туда смотрит. |
| Автор: zmejg 18.12.2007, 23:05 |
| у меня 2005-ая студия. Для mc.exe поправил переменную path. Потом тоже самое сделал для cl.exe Сейчас ошибка такая: core.cxx: fatal error C1902: Program database manager mismatch; please check your installation |
| Автор: xvr 19.12.2007, 10:16 | ||
Похоже на внутреннюю ошибку студии. Сотри все промежуточные файлы (особенно в директориях Debug & Release) и попробуй еще раз. |
| Автор: zmejg 19.12.2007, 21:11 |
| сорри, какие промежуточные файлы?...у меня в сорсах нету никаких Debug и Release. В сорсах только код и ресурсы какие-то. |
| Автор: xvr 20.12.2007, 13:00 | ||
Тогда посмотри нет ли в PATH других версий VS - очень похоже на несоотвествие версий внутренних тулзов VS. Кстати, попробуй запустить vcvars32.bat из Common?\Tools директории перед запуском nmake - он настраивает все переменные окружения, необходимые для работы с коммандной строки. Вообще makefile там заточен под VC 6.0 |
| Автор: zmejg 22.12.2007, 17:22 |
| других версий нет и никогда не было. vcvar32.bat запустил. Теперь такая ошибка: NMAKE : fatal error U1077 '"C:\Program files\Microsoft Visual Studio 2005\VC\bin\cl.EXE"' : return code '0x0000135' Stop. |
| Автор: xvr 22.12.2007, 22:54 | ||
Обламалась компиляция, что ей надо по приведенным сообщениям непонятно :( Еще какие-нибудь сообщения (или лог файлы) были? |
| Автор: zmejg 24.12.2007, 21:03 |
| не было. после запуска vcvar32.bat только такое сообщение и больше ничего. |
| Автор: xvr 24.12.2007, 22:14 | ||
Что то у тебя с инсталяцией студии не то :( Взял VS 2003 (2005 нет, увы), распаковал сорцы, скопировал vsvars32.bat из студии и запустил с командной строки: vsvars32.bat & nmake - все откомпилилось, получен файл debug\msxsl.exe У тебя вообще cl.exe с коммандной строки нормально запускается? |
| Автор: zmejg 25.12.2007, 19:51 |
| точно. такая команда: C:\>cl.exe выдала ошибку - не удается найти mspdb80.dll. Нашел эту dll-ку, установил на нее переменную path. Теперь при запуске nmake ошибка такая: c:\msxslsrc\core.hxx(10) : fatal error C1034 : windows.h: no include path set nmake : fatal error U1077: C:\Program files\Microsoft Visual Studio 2005\VC\bin\cl.EXE"': return code '0x2' Stop. |
| Автор: xvr 26.12.2007, 23:30 | ||
vsvars32.bat должен устанавливать ВСЕ переменные окружения, необходимые для работы компилятора и пр. По всей видимости они не устанавливаются, или vsvars32.bat взят не оттуда, или установка VS 2005 кривая (например C++ не установлен, или Platform SDK не установлен, что врядли) |
| Автор: zmejg 27.12.2007, 02:12 |
| c vsvars32.bat разобрался. Не сразу понял, что её просто нужно запускать из каталога с сорсами. Блин, занудное это дело. Теперь ошибка такая: main.cxx(84) : error C2220: warning treated as error - no 'object' file generated main.cxx(84) : warning C4996: '_itow' was declared deprecated C:\Program files\Microsoft Visual Studio 2005\VC\include\stdlib.h(612) : see declaration of '_itow' Message : This function or variable may be unsafe. Consider using _itow_s instead. To disable deprecation? use _CRT_SECURE_NO_DEPRECATE. See online help for details. (и так не только в main.cxx но и во всех других, где используется _itow) ...сначала попробовал все вызовы _itow заменить на _itow_s. При этом компиляция нормально проходит, а вот при линковании ошибка - unresolved extarnal symbol : _itow_s А если во всех файлах где используется _itow определить макрос: #define _CRT_SECURE_NO_DEPRECATE ...то ничего не происходит - те же самые ошибки. что можно сделать? |
| Автор: xvr 27.12.2007, 15:22 | ||
Не могу проверить - нет VS 2005 под рукой, но похоже, что этот дефайн _CRT_SECURE_NO_DEPRECATE надо задать в makefile'е (добавить в CFLAGS или CPPFLAGS -D=_CRT_SECURE_NO_DEPRECATE) |
| Автор: zmejg 28.12.2007, 20:24 |
| че-то никак... в список флагов CXXFLAGS (CFLAGS - такого нету) добавил _CRT_SECURE_NO_DEPRECATE запускаю nmake: cl : Command line warning D9002 : ignoring unknown option '/_CRT_SECURE_NO_DEPRECATE' (кстати тот же самый варнинг получаю почти для всех остальных опций которые уже есть) а как узнать в каком .lib файле находится определение функции _itow_s? |
| Автор: xvr 28.12.2007, 21:06 | ||||
Надо добавлять -D_CRT_SECURE_NO_DEPRECATE
Смотреть в help'е |
| Автор: zmejg 29.12.2007, 21:27 |
| добавил. я так понял это равносильно определению макроса: #define _CRT_SECURE_NO_DEPRECATE ...нету эффекта. может искал не там, но в хелпе не нашел где определена _itow_s, |
| Автор: xvr 9.1.2008, 15:47 | ||||||
Нашел _itow_s в MSDN (http://msdn2.microsoft.com/en-us/library/0we9x30h(VS.80).aspx):
Оттуда же
Кстати, по поводу depricated функций глянь в http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=87401&SiteID=1 |