Как загрузить XML в ACE?

ОБНОВЛЕНИЕ 1

Вот как я сейчас загружаю текст в свой проект WT.

wApp->require("ace.js");

//orignal XML, reads in incorrectly on one line
//std::string data = ReadFile("Q:\\settings.xml");

//XML after being formatted in notepad to look like xml, reads in correctly
//std::string data = ReadFile("Q:\\settings.txt");

//changed extension back to XML, edited in notepad++ to XML format, reads in correctly
std::string data = ReadFile("Q:\\settings_from_text.xml");

//test xml tag, reads in correctly
//std::string data = "<tag_1>some tag content</tag_1>";

//test xml tag with newline, reads in incorrectly on one line, doesnt read newline
//std::string data = "<tag_1>some tag content</tag_1>\n<tag_1>some tag content</tag_1>";

_ace_editor = new WText(data, Wt::PlainText);

//_ace_editor->setText(data);
_ace_editor->setInline(false);

// A WContainerWidget is rendered as a div
_ace_editor->resize(1000, 500);

std::string editor_ref = _ace_editor->jsRef(); // is a text string that will be the element when executed in JS

std::string command =
editor_ref + "._ace_editor = ace.edit(" + editor_ref + ");" +
editor_ref + "._ace_editor.setTheme(\"ace/theme/chrome\");" +
editor_ref + "._ace_editor.getSession().setMode(\"ace/mode/xml\");";// +
//editor_ref + "._ace_editor.setValue(\"" + data + "\");";

_ace_editor->doJavaScript(command);

Кроме того, здесь есть функция ReadFile

std::ifstream in(path, std::ios::in | std::ios::binary);
if(in)
{
std::string contents;
in.seekg(0, std::ios::end);
contents.resize(in.tellg());
in.seekg(0, std::ios::beg);
in.read(&contents[0], contents.size());
in.close();
return(contents);
}
throw(errno);

ОРИГИНАЛЬНАЯ ПОЧТА

Я пытаюсь загрузить некоторые файлы XML в Ace (http://ajaxorg.github.io/ace/#nav=about) редактор, который я встроил в WT (http://www.webtoolkit.eu/wt?wtd=rqBfShGlNupXgK3M1sWOxUk1Loz3BsW0) страница. Проблема в том, что у файлов XML по какой-либо причине все их теги исключены из загрузки. Пример: файл XML со следующим содержанием

<?xml version="1.0"?>
<settings>
<tag_1>some tag content</tag_1>
<tag_2/>
</settings>

будет загружен как

some tag content

Мне нужен весь XML-файл как есть, а не только содержимое тегов.

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

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

Я использую Visual Studio 2010, и после отладки я вижу, что файл действительно полностью считывается в строку со всеми тегами, но после установки в окне Ace они опускаются.

1

Решение

Фрагменты XML в XML … вы можете как-то ожидать, что ваш браузер будет их интерпретировать, если их не избежать должным образом. Попробуй это:

txt = new WText("<bla>something</bla>", Wt::PlainText);

который будет экранировать все символы XML-кода в вашем тексте.

Wt default (XHTMLText) попытается проанализировать ваш ввод как XML, и, если это удастся, отфильтровать возможные векторы XSS из XML перед отправкой его как XML в браузер. Если он не может проанализировать текст как XML, он будет избегать символов XML-символа, чтобы браузер с либеральным синтаксическим анализатором непреднамеренно выполнял векторы атаки.

Третий вариант (XHTMLUnsafeText) обходит фильтрацию XSS — это опасно, поэтому используйте его только тогда, когда вы знаете, что ваш текст безопасен и не может подвергаться прямому или косвенному влиянию со стороны пользователя.

1

Другие решения

Независимо от того, помещаете ли вы это на страницу WT или нет, суть в том, что это вопрос javascript, так как это редактор ACE, инструмент javascript. Поскольку вы вообще ничего не показали о том, как вы загружаете контент xml, я могу только предположить, что вы должны записывать содержимое файла xml в источник вывода страниц ?? Могу поспорить, если вы посмотрите на источник вы видите теги? Ну, если это так, вы идете об этом неправильно. Файл xml должен быть загружен через javascript / ajax, как я продемонстрирую на полностью работающем примере ниже (отредактируйте ‘url’ в вызове $ .ajax к расположению файла xml на вашем сервере), который показывает теги и все содержимое XML-файла. Добавлена ​​библиотека jQuery только для простоты кода запроса ajax. Наслаждайтесь!

<!DOCTYPE html>
<html lang="en">
<head>
<title>ACE in Action</title>
<style type="text/css" media="screen">
#editor {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
</style>
</head>
<body>

<div id="editor"></div>

<script src="http://rawgithub.com/ajaxorg/ace-builds/master/src-noconflict/ace.js" type="text/javascript" charset="utf-8"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script>
var callback = function (data, status, xhr) {
//data will be the xml returned from the server
if (status == 'success') {
var editor = ace.edit("editor");
//apparently, only modes supported are 'html', 'javascript' & 'text'
editor.getSession().setMode("ace/mode/html");
editor.setValue(data);
}
};
//using jQuery to fire off an ajax request to load the xml,
//using our callback as the success function
$.ajax(
{
url : '/testing/cd_catalog.xml',
dataType : 'text', //explicitly requesting the xml as text, rather than an xml document
success : callback
}
);

</script>
</body>
</html>

На самом деле, я забираю кое-что из того, что я сказал о «должен загружаться через javascript / ajax», так как теперь я понимаю, что вы просто следовали примеру ACE по предварительному размещению содержимого в div редактора. Если вы хотите сделать это с содержимым html или xml, теги будут оцениваться браузером и не будут отображаться, если только вы не скопируете innerHTML div редактора, затем создадите экземпляр редактора и затем установите его значение в ранее сохраненном innerHTML. Например:

<div id="editor"><?xml version="1.0" encoding="ISO-8859-1">
<books>
<text>some text content</text>
<book/>
</books></div>

<script src="http://rawgithub.com/ajaxorg/ace-builds/master/src-noconflict/ace.js" type="text/javascript" charset="utf-8"></script>
<script>
var txt = document.getElementById('editor').innerHTML;
var editor = ace.edit("editor");
//editor.setTheme("ace/theme/monokai");
editor.getSession().setMode("ace/mode/html");
editor.setValue(txt);
</script>
4

По вопросам рекламы [email protected]