SAXParseException发生在我的程序中

时间:2013-02-24 15:21:26

标签: java xml saxparser saxparseexception

我编写了一个程序来读取一组源文件,并使用SrcML工具将它们转换为XML文件。基本上程序如下。

for (------------------) {
    -------------------
    String xmlUri = GetXmlFile(sourceFileUri); // create xml file and get its uri
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();          
    Document doc = dBuilder.parse(xmlUri);
    -------------------
}

对于每个源文件,程序在相同位置创建XML文件(通过覆盖先前创建的文件)并读取XML文件。对于某些源文件,此过程可以正常工作。但是大多数它给出了一些SAX Parse Exceptions如下:

  • 文件过早结束。
  • prolog中不允许使用内容。
  • 元素类型“argcl”必须由匹配的结束标记“”终止。 (此XML文件甚至不包含名称为“argcl”
  • 的元素
  • XML文档结构必须在同一实体内开始和结束。

SrcML工具可创建有效的XML文档。当我检查XML文件中的某些异常时,它没有显示格式有任何问题。 所有异常都指向代码中的同一行:

 "Document doc = dBuilder.parse(xmlUri);"

我已经在堆栈流量以及其他论坛中经历了与此主题相关的大量讨论。两者都没有为我提供克服这个问题的线索。

如果有人能帮助我解决这个问题,我真的很感激。 谢谢。

以下是为读取XML文件而编写的源代码:

private static Document GetXmlDom(String xmlFilePath)
    throws SAXException, ParserConfigurationException, IOException {

File tempFile;
try {
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();          
    Document doc = dBuilder.parse(xmlFilePath);
    if (doc.hasChildNodes()) {
        return doc;
    }
}
catch (IOException e) {
    e.printStackTrace();
    throw e;
}
catch (SAXParseException e) {
    e.printStackTrace();
    throw e;
}

return null;
}

private static String GetXmlFile(String inputFile) throws IOException {
if (new File(inputFile).isFile()) {
    String outFile = FileNameHandler.GetNextNumberedFileName(FileNameHandler.getXmlFlePath(), "outFile.xml");
    Process process = new ProcessBuilder("srcML\\src2srcml.exe", inputFile,
                                        "-o", outFile).start();

    return outFile;
}
else {
    System.out.println("\nNo XML file is created. File does not exist: " + inputFile);
}   
return null;
}

public static List<Tag> SourceToXML(String inputFile) 
    throws SAXException, ParserConfigurationException, IOException {

List<Tag> tagList = new LinkedList<Tag>();
String xmlUri = GetXmlFile(inputFile);
Document doc = GetXmlDom(xmlUri);
if (doc != null) {
    LinkedList<Integer> id = new LinkedList<Integer>();
    id.add(1);
    TagHierarchy.CreateStructuredDom(new TagId(id), doc.getFirstChild(), tagList);
    tagList.get(0).setAncestor(null);
    TagHierarchy.SetTagHierarchy(tagList);
}

return tagList;
}

这是抛出的异常:

  

[致命错误] outFile.xml:461:300:元素类型“argcl”必须是   由匹配的结束标记“”终止。   org.xml.sax.SAXParseException;的systenId:   文件:/ E:/srcML/Output/outFile.xml; lineNumber:461; columnNumber:300;   元素类型“argcl”必须由匹配的end-tag终止   “”。在   com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(未知   来源)at   com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(未知   来自)javax.xml.parsers.DocumentBuilder.parse(未知来源)     在vocab.util.file.FileConverter.SourceToXML(FileConverter.java:188)     在vocab.CodeVocabulary.Create(CodeVocabulary.java:59)at   vocab.CodeVocabulary。(CodeVocabulary.java:53)at   vocab.util.DataAcccessUtil.GetCodeVocabularies(DataAcccessUtil.java:331)     在vocab.TestMain.main(TestMain.java:57)

1 个答案:

答案 0 :(得分:1)

好像你正在启动一个生成XML文件的进程,然后直接读取生成的文件。这意味着解析器将在进程运行时读取文件并写入同一文件。因此解析器不会看到完整生成的文件。

在阅读生成的文件之前,您应该等待该过程完成。

您还应该尊重Java命名约定:方法以小写字母开头。