Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java表示XML文档格式不正确_Java_Xml_Parsing_Xmldocument_Non Well Formed - Fatal编程技术网

Java表示XML文档格式不正确

Java表示XML文档格式不正确,java,xml,parsing,xmldocument,non-well-formed,Java,Xml,Parsing,Xmldocument,Non Well Formed,Java的XML解析器似乎认为我的XML文档在根元素之后的格式不好。但我已经用几个工具验证了它,他们都不同意。这可能是我的代码中的错误,而不是文档本身的错误。我真的很感激你们能给我的任何帮助 以下是我的Java方法: private void loadFromXMLFile(File f) throws ParserConfigurationException, IOException, SAXException { File file = f; DocumentBuilderF

Java的XML解析器似乎认为我的XML文档在根元素之后的格式不好。但我已经用几个工具验证了它,他们都不同意。这可能是我的代码中的错误,而不是文档本身的错误。我真的很感激你们能给我的任何帮助

以下是我的Java方法:

private void loadFromXMLFile(File f) throws ParserConfigurationException, IOException, SAXException {
    File file = f;
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db;
    Document doc = null;
    db = dbf.newDocumentBuilder();
    doc = db.parse(file);
    doc.getDocumentElement().normalize();
    String desc = "";
    String due = "";
    String comment = "";
    NodeList tasksList = doc.getElementsByTagName("task");
    for (int i = 0; i  tasksList.getLength(); i++) {
        NodeList attributes = tasksList.item(i).getChildNodes();
        for (int j = 0; i < attributes.getLength(); j++) {
        Node attribute = attributes.item(i);
        if (attribute.getNodeName() == "description") {
            desc = attribute.getTextContent();
        }
        if (attribute.getNodeName() == "due") {
            due = attribute.getTextContent();
        }
        if (attribute.getNodeName() == "comment") {
            comment = attribute.getTextContent();
        }
        tasks.add(new Task(desc, due, comment));
        }
        desc = "";
        due = "";
        comment = "";
    }
}

如果上下文对这里的任何人都有帮助,我将尝试编写一个简单的GUI应用程序来管理todo列表,该列表可以读取和写入定义任务的XML文件。

尝试将XML声明更改为:

<?xml version="1.0" encoding="UTF-8" ?>

我认为实际文件可能有问题。当我复制您的代码,但使用XML作为解析器的字符串输入时,它可以正常工作(在修复了几个问题之后-
属性。项(I)
应该是
属性。项(j)
并且当
属性==null
时,您需要中断循环)


在试图重现您的错误时,如果我添加另一个
元素,我可以得到相同的消息。这是因为XML不再具有单个根元素(tasklist)。这就是你看到的问题吗?
tasks.XML
中的XML是否只有一个根元素?

值得一提的是,Scala REPL成功解析了您的标记

scala> val tree = <tasklist>
 | <task>
 | <description>Task 1</description>
 | <due>Due date 1</due>
 | <comment>Comment 1</comment>
 | <completed>false</completed>
 | </task>
 | <task>
 | <description>Task 2</description>
 | <due>Due date 2</due>
 | <comment>Comment 2</comment>
 | <completed>false</completed>
 | </task>
 | <task>
 | <description>Task 3</description>
 | <due>Due date 3</due>
 | <comment>Comment 3</comment>
 | <completed>true</completed>
 | </task>
 | </tasklist>
tree: scala.xml.Elem = 
<tasklist>
<task>
<description>Task 1</description>
<due>Due date 1</due>
<comment>Comment 1</comment>
<completed>false</completed>
</task>
<task>
<description>Task 2</description>
<due>Due date 2</due>
<comment>Comment 2</comment>
<completed>false</completed>
</task>
<task>
<description>Task 3</description>
<due>Due date 3</due>
<comment>Comment 3</comment>
<completed>true</completed>
</task>
</tasklist>
scala>val树=
| 
|任务1
|到期日1
|评论1
|假的
| 
| 
|任务2
|到期日2
|评论2
|假的
| 
| 
|任务3
|到期日3
|评论3
|真的
| 
| 
树:scala.xml.Elem=
任务1
到期日1
评论1
假的
任务2
到期日2
评论2
假的
任务3
到期日3
评论3
真的
org.xml.sax.SAXParseException:根元素后面的文档中的标记必须格式正确

这个特殊的异常表示XML文档中有多个根元素。换句话说,
不是唯一的根元素。以XML文档为例,考虑一个没有
元素的文档,根中有三个
元素。这将导致此类异常

因为您发布的XML文件看起来不错,所以问题出在其他地方。看起来它并没有解析您期望它正在解析的XML文件。为了快速调试,请在方法顶部添加以下内容:

System.out.println(f.getAbsolutePath());

在磁盘文件系统中找到该文件并进行验证。

另一个关于它的价值,下面是我在将xml保存到名为
test.xml的文件中并运行它时得到的信息

[jhr@Macintosh] [~]
xmllint test.xml
任务1
到期日1
评论1
假的
任务2
到期日2
评论2
假的
任务3
到期日3
评论3
真的

看起来很好。最有可能的情况是,您在实际文件的某个地方看不到一些零散的字符。尝试在一个编辑器中查看实际文件,该编辑器将显示不可打印的字符,就像其他人建议的那样,如果这不是英文UTF-8机器,您可能有一些Unicode字符,而解析器看不到。否则,您将无法加载您认为是的文件。在将文件输入解析器之前,请执行步骤调试并查看文件的实际内容。

您确定该文件中的所有内容都是这样吗?错误抱怨在当前根目录之后有更多标记。所以在
之后肯定还有别的东西


有时,此错误可能由不可打印的字符引起。如果没有看到任何内容,请对文件进行hexdump。

您可以发布一个示例XML文档吗?您的XML标记似乎已被吃掉-您可以编辑以使其可见吗?你应该能够得到一个
@psmears:不,只需用4个空格缩进,或者选择code,然后按编辑器工具栏中的
010101
按钮或
Ctrl+K
键。你确定输入是你想要的吗?我只提出
编码的建议,因为据我所知和测试,您已经有一个格式良好的XML文档。。。也许你的代码里还有别的东西。我试了一下什么也没得到。无论是否使用编码类型,它仍然会给我相同的错误。
<?xml version="1.0" encoding="UTF-8" ?>
scala> val tree = <tasklist>
 | <task>
 | <description>Task 1</description>
 | <due>Due date 1</due>
 | <comment>Comment 1</comment>
 | <completed>false</completed>
 | </task>
 | <task>
 | <description>Task 2</description>
 | <due>Due date 2</due>
 | <comment>Comment 2</comment>
 | <completed>false</completed>
 | </task>
 | <task>
 | <description>Task 3</description>
 | <due>Due date 3</due>
 | <comment>Comment 3</comment>
 | <completed>true</completed>
 | </task>
 | </tasklist>
tree: scala.xml.Elem = 
<tasklist>
<task>
<description>Task 1</description>
<due>Due date 1</due>
<comment>Comment 1</comment>
<completed>false</completed>
</task>
<task>
<description>Task 2</description>
<due>Due date 2</due>
<comment>Comment 2</comment>
<completed>false</completed>
</task>
<task>
<description>Task 3</description>
<due>Due date 3</due>
<comment>Comment 3</comment>
<completed>true</completed>
</task>
</tasklist>
System.out.println(f.getAbsolutePath());
[jhr@Macintosh] [~]
xmllint test.xml
<?xml version="1.0"?>
<tasklist>  
    <task>  
        <description>Task 1</description>  
        <due>Due date 1</due>  
        <comment>Comment 1</comment>  
        <completed>false</completed>  
    </task>  
    <task>  
        <description>Task 2</description>  
        <due>Due date 2</due>  
        <comment>Comment 2</comment>  
        <completed>false</completed>  
    </task>  
    <task>  
        <description>Task 3</description>  
        <due>Due date 3</due>  
        <comment>Comment 3</comment>  
        <completed>true</completed>  
    </task>  
</tasklist>