我编写了一个程序来读取一组源文件并使用 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,如下所示:
- 文件过早结束。
- 序言中不能有内容。
- 元素类型“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;
}
这是抛出的异常:
[致命错误] outFile.xml:461:300:元素类型“argcl”必须由匹配的结束标记“”终止。org.xml.sax.SAXParseException;systemId:file:/E:/srcML/Output/outFile.xml;行号:461;列号:300;元素类型“argcl”必须由匹配的结束标记“”终止。在 com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source) 在 com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source) 在 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)在 vocab.util.DataAcccessUtil.GetCodeVocabularies(DataAcccessUtil.java:331) 在 vocab。