如何加载XML在ACE?(How to load XML in ACE?)

2019-10-18 01:31发布

更新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文件的,不只是标签的内容。

做了一些研究之后,我发现了不少其他的人在不同的论坛上问同样的事情,但一切我都试过,到目前为止一直没有工作,在这里给我带来。

这包括设置王牌模式到XML,试图将其设置为王牌窗口,改变颜色方案之前加载在不同的容器中的文本,和解析以不同的方式的文件。

我使用Visual Studio 2010,并从调试,我可以看到,文件确会读完全与所有标记的字符串,但它被设置为王牌窗口后,他们被省略。

Answer 1:

在XML XML片段......你能以某种期待您的浏览器会解释它们,除非正确转义。 尝试这个:

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

这将转义所有XML十岁上下的字符在文本。

重量的默认(XHTMLText)将尝试解析您的输入为XML,如果它成功从XML发送它作为XML浏览器之前过滤可能的XSS载体。 如果它不能解析文本作为XML,它会逃跑XML十岁上下的人物,以避免与自由的解析器浏览器会无意中执行攻击向量。

第三个选项(XHTMLUnsafeText)绕过XSS过滤 - 危险,所以只有使用它时,你知道你的文字是安全的,并且不能由用户直接或间接的影响。



Answer 2:

无论你把它的WT页面上与否,底线这是一个JavaScript的问题,因为这是ACE的编辑器是什么,一个JavaScript工具。 既然你没有什么显示在所有关于你如何加载XML内容,我只能猜测,你必须写XML文件的内容到页面输出源? 如果你查看源代码,你看到的标签我敢打赌? 那么,如果这样你要它错了。 xml文件需要通过JavaScript / 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加载”,因为我现在知道你刚才下面把内容插入到编辑器的div事先的ACE的例子。 如果你想做到这一点与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>


文章来源: How to load XML in ACE?