SAXParseException встречается в моей программе
Я написал программу для чтения набора исходных файлов и преобразования их в файлы XML с помощью инструмента SrcML. В основном процедура следующая.
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 следующим образом:
- Преждевременный конец файла.
- Содержание не доступно в прологе.
- Тип элемента "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; systemId: file:/E:/srcML/Output/outFile.xml; номер строки: 461; номер столбца: 300; Тип элемента "argcl" должен заканчиваться соответствующим конечным тегом "". на com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(неизвестный источник) на 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) в vocab.CodeVocababaryary.(CodeVocabulary. (Codejocabulary.) в vocab.util.DataAcccessUtil.GetCodeVocabularies(DataAcccessUtil.java:331) в vocab.TestMain.main(TestMain.java:57)
1 ответ
Кажется, вы запускаете процесс, который генерирует файл XML, и сразу после этого читаете сгенерированный файл. Это означает, что парсер будет читать файл во время работы процесса и записывать в тот же файл. Так что парсер не увидит полный сгенерированный файл.
Вам следует дождаться завершения процесса, прежде чем читать файл, который он генерирует.
Вы должны также соблюдать соглашения об именах Java: методы начинаются со строчной буквы.