JAVA解析XML文件成document对象报错

我的JAVA代码

        SAXReader reader = new SAXReader();//通过SAXReader从文件读取XML文档  
        File file = new File("D:/test.xml");  
        Document document = reader.read(file);
        Element root = document.getRootElement();

报了下面的错

ERROR:Error on line 5 of document file:///D:/test.xml : The processing instruction target matching "[xX][mM][lL]" is not allowed. Nested exception: The processing instruction target matching "[xX][mM][lL]" is not allowed.

在给你们看看我的test.xml

<?xml version="1.0" encoding="utf-8"?>
    <SearchMdInfoByConditionResult xmlns="http://tempuri.org/">
        <success xmlns="http://tempuri.org/">1</success>
        <retdata xmlns="http://tempuri.org/">
            <?xml version="1.0" encoding="utf-8"?>
            <root>
                <data type="MD_GROUPCUST"> 
                        <CustomerCode>B3000002701</CustomerCode>
                        <GroupTopType>0</GroupTopType>
                        <GroupShortName>宁夏有限公司</GroupShortName>
                        <GroupTopName>魏彦辉</GroupTopName>
                        <GroupTopCodeType>1</GroupTopCodeType>
                        <GroupTopCode>1330271962015</GroupTopCode>
                        <BelongCmp></BelongCmp>
                        <BelongCmpName></BelongCmpName>
                        <GroupManager>do2ngli@qq.com</GroupManager>
                        <Remark></Remark>
                        <ModyPerson>李栋</ModyPerson>
                </data>
                <data type="MD_GROUPCUST">
                    <CustomerCode>B3000002676</CustomerCode>
                    <GroupTopType>0</GroupTopType>
                    <GroupShortName>内蒙古有限公司</GroupShortName>
                    <GroupTopName>霍庆华</GroupTopName>
                    <GroupTopCodeType>1</GroupTopCodeType>
                    <GroupTopCode>152921180015</GroupTopCode>
                    <BelongCmp></BelongCmp>
                    <BelongCmpName></BelongCmpName>
                    <GroupManager>don2gli@qq.com</GroupManager>
                    <Remark></Remark>
                    <ModyPerson>李栋</ModyPerson>
                </data>
            </root>
        </retdata>
    </SearchMdInfoByConditionResult>


是不是应为我的xml文件里有2个<?xml version="1.0" encoding="utf-8"?>的原因啊,有没有什么办法让我这个格式的XML也能转换成Document?
阅读 5.2k
3 个回答

是的,因为你的XML格式是不合法的,唯一的办法就是把第五行改成符合要求的XML语法

把第5行的 <?xml version="1.0" encoding="utf-8"?>去掉,xml文档声明一次就可以了,在第一行声明下就可以了。

原因:第五行的 <?xml version="1.0" encoding="utf-8"?> 多了这个xml声明
解决方案:

1.如果是楼主创建xml的时候没有将这个删除了就好。
2.如果是获取出来的xml文本原本是这样的话:
    将使用代码将多余的声明删除

提供如下解决方案:

package cn.lonecloud;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class XmlTest {
    private static final String DELREG = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";

    public static void main(String[] args) throws DocumentException {
        SAXReader reader = new SAXReader();// 通过SAXReader从文件读取XML文档
        File file = new File("D:/test.xml");
        delMoreXml(file,DELREG);
        Document document = reader.read(file);
        Element root = document.getRootElement();

    }
    /**
     * 删除多余的声明
     * @param file xml文件
     * @param reg 删除标识符
     * @return
     */
    public static File delMoreXml(File file,String reg) {
        //获取文件名
        String fileName = file.getAbsolutePath();
        //判断是有多余的xml声明声明
        boolean isReg = false;
        File newFile = new File(fileName+".temp");
        //删除所有多余的delReg
        try (BufferedReader bf = new BufferedReader(new FileReader(file));
                BufferedWriter bw = new BufferedWriter(new FileWriter(newFile));) {
            String line = "";
            while ((line = bf.readLine()) != null) {
                if (line.contains(reg)) {
                    if (isReg) {
                        continue;
                    } else {
                        isReg=true;
                    }
                }
                bw.write(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        //删除源文件
        file.delete();
        //将新文件重新命名
        newFile.renameTo(new File(fileName));
        return newFile;
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题