0

ソース ファイルのセットを読み取り、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);"

スタック オーバー フローや他のフォーラムで、このトピックに関連する多くのディスカッションを行ってきました。どちらも、この問題を克服する手がかりを提供しません。

誰かがこの問題を解決するのを手伝ってくれたら本当に感謝しています。ありがとうございました。

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: ファイル:/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(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 の vocab.util.DataAccessUtil.GetCodeVocabularies(DataAccessUtil.java:331) で。

4

1 に答える 1

1

XMLファイルを生成するプロセスを開始し、その直後に生成されたファイルを読み取るようです。これは、プロセスの実行中にパーサーがファイルを読み取り、同じファイルに書き込むことを意味します。そのため、パーサーは生成されたファイル全体を認識しません。

プロセスが生成するファイルを読み取る前に、プロセスが終了するのを待つ必要があります。

また、Javaの命名規則を尊重する必要があります。メソッドは小文字で始まります。

于 2013-03-01T09:26:26.310 に答える