javascript - 如何在 Javascript 客户端中解码 XML 消息(从 Servlet 响应)?

标签 javascript java xml servlets

好的,在 MyServlet.java

public void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException {
    String chat=req.getParameter("chat");
    String last=req.getParameter("last");

    //String text="<message>data here</message>";--> does not work because it contains <message>
    String text="....";
    resp.setContentType("text/xml");
    String xml="<?xml version=\"1.0\" ?><root>"+
    "<message id=\"0\">"+
    "<user>1</user>" +
    "<text>"+ text + "</text>"+
    "<time>10:30</time>"+
    "</message>"+
    "</root>";

    resp.getWriter().println(xml);
}

ajaxchat.html

//Function for handling the return of chat text
        function handleReceiveChat() {
            if (receiveReq.readyState == 4) {
                var chat_div = document.getElementById('div_chat');
                var xmldoc = receiveReq.responseXML;
                var message_nodes = xmldoc.getElementsByTagName("message"); 
                var n_messages = message_nodes.length
                for (i = 0; i < n_messages; i++) {
                    var user_node = message_nodes[i].getElementsByTagName("user");
                    var text_node = message_nodes[i].getElementsByTagName("text");
                    var time_node = message_nodes[i].getElementsByTagName("time");
                    chat_div.innerHTML += user_node[0].firstChild.nodeValue + '&nbsp;';
                    chat_div.innerHTML += '<font class="chat_time">' + time_node[0].firstChild.nodeValue + '</font><br />';
                    chat_div.innerHTML += text_node[0].firstChild.nodeValue + '<br />';
                    chat_div.scrollTop = chat_div.scrollHeight;
                    lastMessage = (message_nodes[i].getAttribute('id'));
                }
                mTimer = setTimeout('getChatText();',2000); //Refresh our chat in 2 seconds
            }
        }

上面的 2 个代码工作正常。但是,我遇到了一个严重的问题。也就是说,如果用户发送的消息包含类似于标签的文本,例如“<message>”“</message>”、“<user>”、“</user>”等,则它不起作用。

所以我的问题是:

如何在 Javascript 客户端中解码 XML 消息(从 Servlet 响应)?

最佳答案

您需要在消息中添加转义字符,因为它包含一些预定义的 xml 标记。

为此下载此库 unbescape (HtmlEscape.escapeHtml4())。

这里是修改后的代码:

public void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException {
    String chat=req.getParameter("chat");
    String last=req.getParameter("last");

    //String text="<message>data here</message>";--> does not work because it contains <message> 
    String text="....";
    text = HtmlEscape.escapeHtml4(text); // add escape characters
    resp.setContentType("text/xml");
    String xml="<?xml version=\"1.0\" ?><root>"+
    "<message id=\"0\">"+ 
    "<user>1</user>" + 
    "<text>"+ text + "</text>"+
    "<time>10:30</time>"+ 
    "</message>"+ 
    "</root>"; 

    resp.getWriter().println(xml);
} 

当您使用 JavaScript 在网络浏览器中获取此请求时,您不需要删除转义字符。 Html 自己完成。

希望对您有帮助。

关于javascript - 如何在 Javascript 客户端中解码 XML 消息(从 Servlet 响应)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34736068/

相关文章:

javascript - 带分组的 ExtJS 4 EditorGrid : how to edit multiple rows at once

java - 最小值不能以字节保存

java - 为一个条目输入的值存储在其他条目中,而不是唯一值

xml - 我可以在 XSLT 之外的 XPath 中使用 current() 函数吗?

javascript - 在 Rollup 构建的 Electron 应用程序中导入 Ramda 会导致错误

javascript - 如何避免多次函数调用

java - Webservice客户端创建方法

java - 在Java中提取XML属性(ISBNDB)

xml - 重命名 XML 元素并用 XSLT 分隔逗号

每个 html 跨度的 Javascript 倒计时器