Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использование MSXSL.exe (xsl - преобразователь), передача строки в качестве параметра 
:(
    Опции темы
zmejg
Дата 5.12.2007, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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.  Но мне это кажется как-то криво.
Еще интересно, можно ли результат получить тоже в виде строки?

PM MAIL   Вверх
SABROG
Дата 5.12.2007, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
zmejg
Дата 5.12.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



задача такая: есть cgi приложение на C++. Весь результат работы приложения собирается в одной строке вроде xmlText, затем строка подается на стандартный вывод. xmlText сейчас содержит ссылку на файл xsl. Естествнно преобразование в этом случае происходит на стороне клиента (клиент в специальном диалоговом окне будет указывать путь к xsl файлу). Задача сделать это преобразование на стороне сервера.
Цитата

не изменишь способ хранения xml документа

...xml документ вообще нигде не хранится

я не понимаю почему вы меня не понимаете, ведь xmlText содержит не статические данные, а для каждого запроса имеет свое содержимое.

а где можно взять libxml2, мне для винды нужно естественно

Это сообщение отредактировал(а) zmejg - 5.12.2007, 17:36
PM MAIL   Вверх
SABROG
Дата 5.12.2007, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Наверно потому, что я не нашел в первом посте слово CGI. Ну раз программа ваша, то проблемы не вижу, libxml2 кросплатформенный. Собирается через gcc, msvc и mingw.
Может быть есть смысл поработать с msxml.dll, не знаю есть ли там методы для работы с xsl преобразованием. Не люблю поделки мелкософта.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
xvr
Дата 6.12.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(zmejg @ 5.12.2007,  09:57)
Привет всем. Кто может помочь с такой проблемой?

....есть программа на C++. В некоторой строке содержится содержимое XML документа, т.е.

char* xmlText = "<?xml version=\"1.0\"?><root>..... ";

нужно преобразовать данную строку с помощью имеющегося xsl. Но msxsl.exe может принимать исходные данные только из файла, либо со стандартного ввода. Вопрос в том - как можно передать эти данные из строки?

msxsl это демо программа - врапер над MSXML ActiveX компонентом. Ее исходники есть на сайте MS (в MSDN), только они там хитро закопанны, удалось найти только через google :(
Берешь исходники, правишь под свои нужды или зовешь MSXML напрямую.

PM MAIL   Вверх
zmejg
Дата 6.12.2007, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



скажите, как нужно компилировать все это добро?
и какие именно изменения и куда нужно вносить?
PM MAIL   Вверх
xvr
Дата 6.12.2007, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(zmejg @ 6.12.2007,  17:00)
скажите, как нужно компилировать все это добро?

nmake

Цитата

и какие именно изменения и куда нужно вносить?

Main находится в файле main.cxx (как ни странно smile )
Разбор коммандной строки находится в файлах cmdline.cxx/hxx
Собственно преобразование - в файле transfrm.cxx
Имена файлов:
Входной - _bstrInput
Шаблон - _bstrStylesheet
Выходной - _bstrOutput
Файловые потоки содержатся в файлах seqstrm.cxx/hxx
Можно заменить реализацию файловых потоков, что бы они читали строки из памяти, в качестве имени файла они будут принимать указатели на строки (в текстовом виде)
Функцию main надо переименовать во что-нибудь отличное от main
Функцию mainCRTStartup - убрать.
В функции HRESULT ParseCommandLine::Parse() {return Parse(GetCommandLineW());} - GetCommandLineW заменить на свою коммандную строку (приготовленную в памяти) и позвать бывшую main.

Да, всю эту бодягу прилинковать к своей программе


PM MAIL   Вверх
zmejg
Дата 15.12.2007, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



а как пользоваться nmake?

я понимаю что есть такие вещи как google, msdn и т.д... но так слишком сложно искать что-то конкретное. Может в двух словах напишете как собирать проекты с помощью make файлов
PM MAIL   Вверх
xvr
Дата 15.12.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(zmejg @ 15.12.2007,  10:47)
а как пользоваться nmake?

я понимаю что есть такие вещи как google, msdn и т.д... но так слишком сложно искать что-то конкретное. Может в двух словах напишете как собирать проекты с помощью make файлов

Заходишь в директорию с сорцами, убеждаешься, что у тебя настроенны пути на VC, набираешь nmake
Если хочешь более подробно - загляни в makefile (файл такой, в директории с сорцами)

PM MAIL   Вверх
maxim1000
Дата 15.12.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(zmejg @  5.12.2007,  09:57 Найти цитируемый пост)
Но msxsl.exe может принимать исходные данные только из файла, либо со стандартного ввода

такое ощущение, что этого никто не заметил
если использовать CreateProcess, перенаправить стандартный ввод на что угодно не составляет большой проблемы...


--------------------
qqq
PM WWW   Вверх
SABROG
Дата 15.12.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Можно, конечно, CreatePipe сделать, но это не правильный выход из ситуации. Это все-равно что принимать данные через SMS, мобильный телефон положить на сканнер, а FineReader будет расшифровывать, а плагин для FineReader'a обрабатывать.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
zmejg
Дата 15.12.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



видимо двух слов недостаточно...
в командной строке в директории msxslsrc пишу :
C:\>msxslsrc> nmake.exe makefile

...и ничего не происходит. А что должно быть? Как скомпилировать исходный проект хотя бы для начала без моих изменений?
PM MAIL   Вверх
jonie
Дата 17.12.2007, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



что значит ничего не происходит?? тупо черный экран и мигающий курсор чтоли? и вообще НИЧЕГО?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
zmejg
Дата 17.12.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



написано что-то вроде:

makefile is up-to-date

...что это означает?
PM MAIL   Вверх
xvr
Дата 17.12.2007, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(zmejg @ 15.12.2007,  16:50)
видимо двух слов недостаточно...
в командной строке в директории msxslsrc пишу :
C:\>msxslsrc> nmake.exe makefile

...и ничего не происходит. А что должно быть? Как скомпилировать исходный проект хотя бы для начала без моих изменений?

makefile здесь лишний, надо просто nmake без параметров

Цитата

makefile is up-to-date

...что это означает?

Это значит, что ты сказал nmake, что хочешь собрать makefile, и nmake сообщил, что makefile вполне новый - нет никаких новых файлов, от которых бы он зависел.

PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0874 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.