Регистрация  |  Вход

Visualforce страница, возвращающая XML

фактически это продолжнеие темы про генерацию Word документов с помощью VF страниц, но полагаю, что применение Visualforce страниц, возвращающих XML, может быть шире, чем только генерация Word документов.

план был таким: Word документ сохраняется в WORD 2003 XML формате, XML копируется в VF страницу, переменная часть заменяется на соответствующие переменные, а страница - Word документ готова! (т.е. в данном случае не нужно создавать XML динамически в Апексе, так как он служит просто статичным шаблоном-каркасом, размешенным на странице, а контроллера в норме вообще нет, так как используется страндартный).

но не тут то было.

сначала не получается сохранить <?xml ?> declaration:
Error: The processing instruction target matching “[xX][mM][lL]” is not allowed

вот общие варианты решения
http://stackoverflow.com/questions/19889132/error-the-processing-instruction-target-matching-xxmmll-is-not-allowed
но на самом деле в СФ нужно просто увести <?xml ?> declaration в контроллер, например, компонента:
https://developer.salesforce.com/forums/?id=906F000000095FbIAI

но и в таком случае не удастся сохранить например такую разметку:
<w:wordDocument...
<o:DocumentProperties>
тут же спотыкается на
Error: Unknown component w:worddocument

впрочем если убрать Word-вский namespace вроде w: или o: то вроде сохраняется...

Казалось бы такая простая задача, вставить статичный XML в страницу и столько проблем.

что делать?
(1) полность переносить XML в стринговые переменные в контроллер. Ужас, ужас, это просто статичный шаблон, там нет никой динамики.
(2) заменить <?xml ?> declaration и Word-вский namespace на контроллерные переменные... выглядит как корявый "workaround", но может сработает...

может у вас есть варианты получше?

фактически это продолжнеие темы про генерацию Word документов с помощью VF страниц, но полагаю, что применение Visualforce страниц, возвращающих XML, может быть шире, чем только генерация Word документов.

план был таким: Word документ сохраняется в WORD 2003 XML формате, XML копируется в VF страницу, переменная часть заменяется на соответствующие переменные, а страница - Word документ готова! (т.е. в данном случае не нужно создавать XML динамически в Апексе, так как он служит просто статичным шаблоном-каркасом, размешенным на странице, а контроллера в норме вообще нет, так как используется страндартный).

но не тут то было.

сначала не получается сохранить <?xml ?> declaration:
[i]Error: The processing instruction target matching “[xX][mM][lL]” is not allowed[/i]

вот общие варианты решения
http://stackoverflow.com/questions/19889132/error-the-processing-instruction-target-matching-xxmmll-is-not-allowed
но на самом деле в СФ нужно просто увести <?xml ?> declaration в контроллер, например, компонента:
https://developer.salesforce.com/forums/?id=906F000000095FbIAI

но и в таком случае не удастся сохранить например такую разметку:
<w:wordDocument...
<o:DocumentProperties>
тут же спотыкается на
Error: Unknown component w:worddocument

впрочем если убрать Word-вский namespace вроде w: или o: то вроде сохраняется...

Казалось бы такая простая задача, вставить статичный XML в страницу и столько проблем.

что делать?
(1) полность переносить XML в стринговые переменные в контроллер. Ужас, ужас, это просто статичный шаблон, там нет никой динамики.
(2) заменить <?xml ?> declaration и Word-вский namespace на контроллерные переменные... выглядит как корявый "workaround", но может сработает...

может у вас есть варианты получше?




Кладешь шаблон в аттачмент, документ или статик ресурс и пишешь парсер для все этого. Если нужно могу дать детали. Хотя если очень нужно могу поискать парсер 2-хлетней давности

Кладешь шаблон в аттачмент, документ или статик ресурс и пишешь парсер для все этого. Если нужно могу дать детали. Хотя если очень нужно могу поискать парсер 2-хлетней давности

спасибо wilder

вот так получилось вернуть страницей XML из статик ресурса

<apex:page contentType="application/msWord#Test" cache="true" controller="myContrl">{!templateFromStatic}</apex:page>

{!templateFromStatic} обязательно на одной строке и впритык в открывающему apex:page тегу

public with sharing class myContrl {

public string getTemplateFromStatic() {

return [select id, name, body from StaticResource where name = 'wordTest'][0].body.toString();

}
}

я думаю, что заполнить шаблон информацией можно просто поиском и заменой подстроки. но это для простых документов, а вот если там есть таблица с итерируемыми строками (а не просто для форматирования), то возможно сразу лучше использовать парсер.
ну а если нужен Excel.xml - то там точно только парсер, так что может быть позже обращусь к wilder за ним.

спасибо wilder

вот так получилось вернуть страницей XML из статик ресурса

[code]<apex:page contentType="application/msWord#Test" cache="true" controller="myContrl">{!templateFromStatic}</apex:page>[/code]
{!templateFromStatic} обязательно на одной строке и впритык в открывающему apex:page тегу

[code]public with sharing class myContrl {

public string getTemplateFromStatic() { 
    
return  [select id, name, body from StaticResource where name = 'wordTest'][0].body.toString();

}
}[/code]

я думаю, что заполнить шаблон информацией можно просто поиском и заменой подстроки. но это для простых документов, а вот если там есть таблица с итерируемыми строками (а не просто для форматирования), то возможно сразу лучше использовать парсер.
ну а если нужен Excel.xml - то там точно только парсер, так что может быть позже обращусь к wilder за ним.

Если не ошибаюсь то DocuSign умеет это делать. Так что может проще купить?

Если не ошибаюсь то DocuSign умеет это делать. Так что может проще купить?

wilder
Если не ошибаюсь то DocuSign умеет это делать. Так что может проще купить?

вся суть автоматизации бизнес процессов заключается в уходе от бумажного или "бумажно-подобного" (как Word документы) документооборота. Все данные должны храниться непосредственно в БД, и посредникам-носителям данных в виде Word документов в норме нет места.
Но иногда все же требуется, когда это исходящий и покидающий навсегда документ.
Так что надеюсь это единичный случай с небольшим business value, так что более серьезные решения не потребуются.

[quote="wilder"]Если не ошибаюсь то DocuSign умеет это делать. Так что может проще купить?[/quote]

вся суть автоматизации бизнес процессов заключается в уходе от бумажного или "бумажно-подобного" (как Word документы) документооборота. Все данные должны храниться непосредственно в БД, и посредникам-носителям данных в виде Word документов в норме нет места.
Но иногда все же требуется, когда это исходящий и покидающий навсегда документ.
Так что надеюсь это единичный случай с небольшим business value, так что более серьезные решения не потребуются.

Ну на самом деле мой парсер работает с текстовыми файлами и ему не важно xml это txt.

Ну на самом деле мой парсер работает с текстовыми файлами и ему не важно xml это txt.

wilder,

я сохраняю сгенерированный файл формата "XML spreadsheet 2003" в виде аттача к записи, а позже юзеры загружают его себе и открывают.

проблема в том, чтобы заставить пользовательский браузер-систему "определить" файл как Excel документ, и тем самым запусить именно Excel для его обработки.

для этого, я указываю формат '.xls' (хотя этот файл правильнее обозначить как '.xml'):

attachment.name = r.Name+'.xls';

и указываю МЕМО тип:

attachment.ContentType = 'application/vnd.ms-excel';

этот вариант "работает" для меня (но не всегда для пользователей), хотя Excel вначале брыкается, что мол, написали '.xls', а на самом деле это XML...

есть еще один вариант:

attachment.name = r.Name+'.xml';
attachment.ContentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';

он по существу более правильный, но по факту хуже "работает", кроме того если пользователь сохранит этот '.xml' файл, то нет шансов, что у него обработчиком '.xml' назначен Excel; для нас это ерунда разрулить, а для обычного пользователя проблема, им нужно чтоб загруженный файл безошибочно определялся и открывался Excel.

Как ты этот вопрос решал?

[b]wilder,[/b]

я сохраняю сгенерированный файл формата "XML spreadsheet 2003" в виде аттача к записи, а позже юзеры загружают его себе и открывают.

проблема в том, чтобы заставить [i]пользовательский[/i] [b][/b]браузер-систему "определить" файл как Excel документ, и тем самым запусить именно Excel для его обработки.

для этого, я указываю формат '.xls' (хотя этот файл правильнее обозначить как '.xml'):

[code]attachment.name = r.Name+'.xls';[/code]

и указываю МЕМО тип:

[code]attachment.ContentType = 'application/vnd.ms-excel';[/code]

этот вариант "работает" для меня (но не всегда для пользователей), хотя Excel вначале брыкается, что мол, написали '.xls', а на самом деле это XML...

есть еще один вариант:
[code]attachment.name = r.Name+'.xml';
attachment.ContentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';[/code]
он по существу более правильный, но по факту хуже "работает", кроме того если пользователь сохранит этот '.xml' файл, то нет шансов, что у него обработчиком '.xml' назначен Excel; для нас это ерунда разрулить, а для обычного пользователя проблема, им нужно чтоб загруженный файл безошибочно определялся и открывался Excel.

Как ты этот вопрос решал?

попробуй application/msexcel и расширение файла xls

Я писал парсер для Доков и использовал просто application/msword и расширение doc, клиент не жаловался.

попробуй application/msexcel и расширение файла xls

Я писал парсер для Доков и использовал просто application/msword и расширение doc, клиент не жаловался.