更新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文件加载到我嵌入WT(http://ajaxorg.github.io/ace/#nav=about)页面的Ace(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窗口后,它们被省略。
答案 0 :(得分:4)
无论你是否将它放在WT页面上,底线这是一个javascript问题,因为ACE编辑器是一个javascript工具。既然你没有展示任何关于如何加载xml内容的东西,我只能推测你必须将xml文件的内容写入页面输出源?我敢打赌,如果你查看源码,你看到了标签吗?好吧,如果是这样你就错了。 xml文件需要通过javascript / ajax加载,我将通过下面的完整工作示例演示(编辑服务器上xml文件位置的$ .ajax调用中的'url'),其中显示了标签和所有内容的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内容做这些,那么标签将由浏览器评估而不显示,除非你复制编辑器div的innerHTML然后实例化编辑器然后将它的值设置为先前保存的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>
答案 1 :(得分:1)
XML中的XML片段......除非正确转义,否则您可以以某种方式期望您的浏览器会解释它们。试试这个:
txt = new WText("<bla>something</bla>", Wt::PlainText);
将转义文本中的所有XML-ish字符。
Wt的默认值(XHTMLText)将尝试将您的输入解析为XML,如果成功,则在将XML作为XML发送到浏览器之前,从XML中过滤可能的XSS向量。如果它不能将文本解析为XML,它将转义XML-ish字符,以避免具有自由解析器的浏览器无意中执行攻击向量。
第三个选项(XHTMLUnsafeText)绕过XSS过滤 - 危险,所以只有当您知道文本是安全的且不能被用户直接或间接影响时才使用它。