问答详情
源自:4-4 JDOM 解析时乱码的处理

为什么会报错?

package com.imooc.jdomtest;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

import java.io.*;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * User: QiuShiLe
 * Date: 2015/3/26
 * Time: 19:37
 * Project: XMLAnalyse
 */
public class JDOMTest {
    public static void main(String[] args) {

        //创建一个SAXBuilder对象
        SAXBuilder saxBuilder = new SAXBuilder();
        //创建一个输入流 以加载xml
        InputStream in;

        try {
            in = new FileInputStream("demo" + java.io.File.separator + "books.xml");
            InputStreamReader isr = new InputStreamReader(in, "UTF-8");
            Document document = saxBuilder.build(isr);
            //获取根节点
            Element rootElement = document.getRootElement();
            //获取子节点的集合
            List<Element> bookList = rootElement.getChildren();

            for (Element book : bookList) {
                System.out.println("===开始解析第" + (bookList.indexOf(book) + 1) + "本书===");

                //解析book的属性
                //book.getAttributeValue("id"); //知道名称时获取节点值
                List<Attribute> attrList = book.getAttributes();
                for (Attribute attr : attrList) {
                    System.out.println(attr.getName());
                    System.out.println(attr.getValue());
                }

                List<Element> bookChilds = book.getChildren();
                for (Element child : bookChilds) {
                    System.out.println("节点" + child.getName() + "的值为" + child.getValue());
                }
//
//                //对book的子节点及节点值遍历
//                for (Element child : book.getChildren()) {
//                    System.out.println("节点 " + child.getName() + " 的值为 " + child.getValue());
//                }


                System.out.println("===结束解析第" + (bookList.indexOf(book) + 1) + "本书===");
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
"C:\Program Files\Java\jdk1.8.0_20\bin\java" -Didea.launcher.port=7535 "-Didea.launcher.bin.path=D:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_20\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_20\jre\lib\ext\zipfs.jar;D:\WorkStation\IntelliJ\XMLAnalyse\out\production\XMLAnalyse;D:\Downloads\jdom-2.0.6\jdom-2.0.6.jar;D:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.1\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.imooc.jdomtest.JDOMTest
org.jdom2.input.JDOMParseException: Error on line 1: 前言中不允许有内容。
    at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:232)
    at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:303)
    at org.jdom2.input.SAXBuilder.build(SAXBuilder.java:1196)
    at com.imooc.jdomtest.JDOMTest.main(JDOMTest.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1436)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:999)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:649)
    at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:217)
    ... 8 more

Process finished with exit code 0


提问者:隔壁王爷爷 2015-03-31 14:13

个回答

  • Perona
    2015-03-31 14:23:43
    已采纳

    应该是编码错误,你看下xml编码是不是utf-8。因为识别不出XML,才会报前言不能有内容

  • 醉梦呆瓜
    2019-05-04 20:30:43

    我也是出现了这个问题 修改了编码就好了  原本的编码是 UTF-8 with BOM

  • qq_爱笑的蜗牛_0
    2016-12-15 14:52:06

    你使用Editor打开,将文件保存为无BOM头的UTF-8格式,类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM),这个应该就是指前沿中的内容,只要去掉就可以执行了。


  • qq_爱笑的蜗牛_0
    2016-12-15 14:00:47

    你的xml文件出现错误了,<?xml>中间没有空格,如果有空格的话会出现错误,如果是编码问题的话,打印出来是乱码,而不是这个错误。

  • pojo
    2016-06-28 18:12:32

    应该是读取的xml文件包含BOM头,我用Sublime打开 -> 文件 -> 保存编码 -> UTF-8 就好了

  • qq_绳筋纸_0
    2015-11-24 16:27:37

    请问“前言不能有内容”这个问题你解决了吗?,代码和老师的一样,但是还会报错

  • Perona
    2015-03-31 14:16:17

    隔壁老邱你好,隔壁老邱再见!

  • 隔壁王爷爷
    2015-03-31 14:13:54

    http://img.mukewang.com/551a3b16000101d911100977.jpg

    这是原图