1

更新 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://www.webtoolkit.eu/wt?wtd的 Ace ( http://ajaxorg.github.io/ace/#nav=about ) 编辑器中=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 窗口之后,它们被省略了。

4

2 回答 2

4

无论您是否将其放在 WT 页面上,归根结底这是一个 javascript 问题,因为这就是 ACE 编辑器,一个 javascript 工具。由于您根本没有显示有关如何加载 xml 内容的任何内容,我只能推测您必须将 xml 文件的内容写入页面输出源?我敢打赌,如果您查看源代码,您会看到标签吗?好吧,如果是这样,那你就错了。xml 文件需要通过 javascript/ajax 加载,因为我将在下面使用一个完整的示例进行演示(编辑 $.ajax 调用中的“url”到服务器上 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 内容执行此操作,则标签将由浏览器评估并且不会显示,除非您复制编辑器 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>
于 2013-04-22T13:08:46.680 回答
1

XML 中的 XML 片段......您可以以某种方式期望您的浏览器会解释它们,除非正确转义。尝试这个:

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

这将转义文本中的所有 XML-ish 字符。

Wt 的默认 (XHTMLText) 将尝试将您的输入解析为 XML,如果成功,则在将其作为 XML 发送到浏览器之前从 XML 中过滤可能的 XSS 向量。如果它不能将文本解析为 XML,它将转义 XML-ish 字符以避免具有自由解析器的浏览器无意中执行攻击向量。

第三个选项 (XHTMLUnsafeText) 绕过 XSS 过滤 - 危险,因此只有在您知道您的文本是安全的并且不会受到用户直接或间接影响时才使用它。

于 2013-04-24T09:09:15.380 回答