6

以下に示すように、JDOMとxpathを使用してXMLファイルを解析し、ファイルを解析するプロセスがあります。

private static SAXBuilder   builder         =   null;
private static Document     doc         =   null; 
private static XPath        xpathInstance       =   null;

builder = new SAXBuilder();
Text list = null;

try {
    doc = builder.build(new StringReader(xmldocument));

} catch (JDOMException e) {
            throw new Exception(e);
} 



try {
    xpathInstance = XPath.newInstance("//book[author='Neal Stephenson']/title/text()");
    list = (Text) xpathInstance.selectSingleNode(doc);
} catch (JDOMException e) {
    throw new Exception(e);
}

上記は問題なく動作します。xpath式はプロパティファイルに保存されるため、いつでも変更できます。ここで、4000バイトのチャンクでのみxmlファイルを送信するレガシーシステムからのいくつかのxmlファイルを処理する必要があります。既存の処理は4000バイトのチャンクを読み取り、各チャンクをデータベースの1行としてOracleデータベースに格納します(レガシーシステムに変更を加えるか、データベースの行としてチャンクを格納する処理は問題外です) 。

特定のxmlドキュメントに関連するすべての行を抽出してそれらをマージし、既存の処理(上記)を使用してxmlドキュメントを解析することにより、完全な有効なXMLドキュメントを作成できます。

ただし、XMLドキュメントから抽出する必要のあるデータは、常に最初の4000バイトになります。もちろん、このチャンクは不完全であるため有効なXMLドキュメントではありませんが、必要なすべてのデータが含まれています。JDOMビルダーが拒否するため、1つのチャンクだけを解析することはできません。

有効なXMLドキュメントを取得するために、すべての部分(非常に多くの部分になる可能性があります)をマージせずに、不正な形式のXMLチャンクを解析できるかどうか疑問に思っています。これにより、データベースに何度かアクセスしてチャンクが使用可能かどうかを確認でき、最初の4000バイトを使用できるようにするためだけに数百のチャンクをマージする必要がなくなります。

私はおそらくJavaの文字列関数を使用して関連データを抽出できることを知っていますが、これはパーサーまたはxpathを使用して可能ですか?または、両方とも、解析する前にxmlドキュメントが整形式のドキュメントであることを期待していますか?

4

1 に答える 1

5

JSoupを使用して、無効なXMLを解析することができます。定義上、XMLは整形式である必要があります。そうでない場合、XMLは無効であり、使用しないでください。

更新-例:

public static void main(String[] args) {
    for (Node node : Parser.parseFragment("<test><author name=\"Vlad\"><book name=\"SO\"/>" ,
            new Element(Tag.valueOf("p"), ""),
            "")) {
        print(node, 0);
    }
}

public static void print(Node node, int offset) {
    for (int i = 0; i < offset; i++) {
        System.out.print(" ");
    }
    System.out.print(node.nodeName());
    for (Attribute attribute: node.attributes()) {
        System.out.print(", ");
        System.out.print(attribute.getKey() + "=" + attribute.getValue());
    }
    System.out.println();
    for (Node child : node.childNodes()) {
        print(child, offset + 4);
    }
}
于 2011-08-08T12:27:39.510 に答える