XML或文本声明不在实体的开头 - java

时间:2011-06-28 11:29:44

标签: java xml parsing

我使用Java并调用web服务。当我在我的网页上显示响应时:

String str=answer.toString();
label.setText(str);

没关系。但是当我想调用JavaScript函数时,我失败了。我使用了一个有效的代码(here)并将其更改为我想要的。 所以在我的代码的开头我有

import netscape.javascript.JSException;
import netscape.javascript.JSObject;

然后再

        try {
        jso = JSObject.getWindow(this);  // line 38
    } catch (JSException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

然后再

jso.call("affiche1",new String[] {String.valueOf(str.trim()).trim()}); // line 110

“affiche”是我的js函数,它应该在我的网页上显示答案。

当我使用Eclipse运行它时,我得到了错误

  

netscape.javascript.JSException       在netscape.javascript.JSObject.getWindow(未知来源)       在Test2.init(Test2.java:38)       在sun.applet.AppletPanel.run(未知来源)       在java.lang.Thread.run(未知来源)

     

显示java.lang.NullPointerException       在Test2 $ 1.actionPerformed(Test2.java:110)       在javax.swing.AbstractButton.fireActionPerformed(未知来源)       at javax.swing.AbstractButton $ Handler.actionPerformed(Unknown Source)       在javax.swing.DefaultButtonModel.fireActionPerformed(未知来源)       在javax.swing.DefaultButtonModel.setPressed(未知来源)       在javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知来源)       at java.awt.Component.processMouseEvent(Unknown Source)       在javax.swing.JComponent.processMouseEvent(未知来源)       at java.awt.Component.processEvent(Unknown Source)       at java.awt.Container.processEvent(Unknown Source)       at java.awt.Component.dispatchEventImpl(Unknown Source)       at java.awt.Container.dispatchEventImpl(Unknown Source)       at java.awt.Component.dispatchEvent(Unknown Source)       at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)       at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)       at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)       at java.awt.Container.dispatchEventImpl(Unknown Source)       at java.awt.Component.dispatchEvent(Unknown Source)       at java.awt.EventQueue.dispatchEvent(Unknown Source)       at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)       at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)       at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)       at java.awt.EventDispatchThread.pumpEvents(Unknown Source)       at java.awt.EventDispatchThread.pumpEvents(Unknown Source)       在java.awt.EventDispatchThread.run(未知来源)

线38和110在上面精确。 当我在Mozilla中运行它时,我得到了错误

  

XML或文本声明不在实体第1行的开头

  "<html xmlns="http://www.w3.org/1999/xh...teReply></soap:Body></soap:Envelope></"

  

指定了无效或非法的字符串“code:”12   文件:/// L:/pwe/onload_refresh/ngonl/pub/htmlkit/effects.js   第22行

我在网上找不到类似的东西。我刚刚找到建议:删除我的xml文件中的空格,但我认为不是因为当我在applet中显示它时没有问题(我不知道该怎么做,我是一个非常初学者在java)。

我真的不明白因为我有这条线

jso.call("affiche1",new String[] {String.valueOf(str.trim()).trim()});

我使用trim()之前和之后删除了空格 - 两个不是必需的,但我想确保放弃它!我认为Eclipse中的错误并不重要,因为我得到了相同的东西(她可能在这里,因为它调用javascript,而javasript不在我的eclipse项目中?)。

我发现它很奇怪,因为我有一个字符串,而不是XML,对吧?所以我真的不明白为什么会出现这个错误...

非常感谢您的帮助和建议。

2 个答案:

答案 0 :(得分:1)

首先,第110行中的NullPointerException(您在示例中突出显示)只能表示jso变量为null,因为该行的其余部分不会抛出NullPointerException。

在不了解您的应用程序的情况下,您应该尝试看看为什么会出现这种情况。它是否在所有情况下都设置为非空值,在它到达此行之前(并且也没有设置回null)?

在您的具体情况下,只需使用.printStacktrace()打印出Javascript异常即可让您的程序继续运行,jso变量为null。所以你必须修复Javascript异常的根本原因 - 这也会使NullPointerException消失。一般来说,最好抛出异常,而不是仅仅打印它们并继续。

此外,你应该遵循建议去除多余的空白。特别是在XML文档的开头,不能具有空格,否则解析器可能会拒绝它。 XML文件必须以左括号开头;有时甚至XML流开头的UTF-8/16/32字节顺序标记也会导致问题。它们通常在编辑期间由编辑引入,即使您通常看不到它们,除非您以十六进制视图查看文件。

在Applet中显示XML并不表示它是正确的 - 您只需设置标签的文本,它根本不关心它是否是XML,更不用说它是否有效。

答案 1 :(得分:1)

问题解决了:

它是innerHTML,因为里面有非HTML标签。 因此,我不是直接使用innerHTML,而是在javascript中调用此函数:

function test (str) {
    function parseXML( xml ) {
        if( window.ActiveXObject && window.GetObject ) {
            var dom = new ActiveXObject( 'Microsoft.XMLDOM' );
            dom.loadXML( xml );
            return dom;
        }
        if( window.DOMParser )
            return new DOMParser().parseFromString( xml, 'text/xml' );
        throw new Error( 'No XML parser available' );
    }

    str = parseXML(str);
    var supertest = str.getElementsByTagName("tag1")[0].childNodes[0].nodeValue;
    document.getElementById('ici').innerHTML ="value of tag1  :  " + supertest;
}

我解析它(字符串到dom),然后我得到我想要的值(到tag1标签),然后我编辑html。事实上,这就是我想要的。测试显示整个字符串并不是一个好主意,因为&lt;而不能完成。标签&gt;内部。

希望它会对某人有所帮助。