gpt4 book ai didi

java - 我的程序中发生 SAXParseException

转载 作者:行者123 更新时间:2023-12-01 14:49:08 25 4
gpt4 key购买 nike

我编写了一个程序来读取一组源文件并使用 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 解析异常,如下所示:

  • 文件提前结束。
  • 序言中不允许出现内容。
  • 元素类型“argcl”必须以匹配的结束标记“”结尾。 (此 XML 文件甚至不包含名为“argcl”的元素
  • XML 文档结构必须在同一实体内开始和结束。

SrcML 工具创建有效的 XML 文档。当我检查 XML 文件中是否存在某些异常时,它没有显示任何格式错误。所有异常都指出代码中的同一行:

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

我在 stack over flow 以及其他论坛中进行了许多与此主题相关的讨论。两者都没有给我提供解决这个问题的线索。

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

以下是读取 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;
}

这是抛出的异常:

[Fatal Error] outFile.xml:461:300: The element type "argcl" must be terminated by the matching end-tag "". org.xml.sax.SAXParseException; systemId: file:/E:/srcML/Output/outFile.xml; lineNumber: 461; columnNumber: 300; The element type "argcl" must be terminated by the matching end-tag "". at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source) at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source) at javax.xml.parsers.DocumentBuilder.parse(Unknown Source) at vocab.util.file.FileConverter.SourceToXML(FileConverter.java:188) at vocab.CodeVocabulary.Create(CodeVocabulary.java:59) at vocab.CodeVocabulary.(CodeVocabulary.java:53) at vocab.util.DataAcccessUtil.GetCodeVocabularies(DataAcccessUtil.java:331) at vocab.TestMain.main(TestMain.java:57)

最佳答案

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

您应该等待该过程完成,然后再读取它生成的文件。

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

关于java - 我的程序中发生 SAXParseException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15053184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com