0

編集:私の問題を見つけました!

私の問題を見つけました!

実際には、新しいファイルを作成するために 2 つの呼び出しがありました。

if (!f.exists())
    f.createNewFile();

Result result = new StreamResult(f);
transformer.transform(source, result);

ファイル名に空白がなければ、両方とも同じファイルを扱っていたため、すべてうまくいきました。ただし、空白を使用すると、StreamResult はファイル名を URL としてエンコードします (したがって、%20 でスペースを置き換えます) が、createNewFile() はエンコードしません。修正は簡単でした。私は

f.createNewFile();

行と追加:

result.setSystemId(java.net.URLDecoder.decode(result.getSystemId(), "UTF-8"));

したがって、ファイル名をスペースで正しく記述します。

元の質問:

XML ファイルを書き込もうとしていますが、ファイル名に空白がある場合、次のコードは 2 つの異なるファイルを生成するようです。最初のファイルは空白で正しく名前が付けられ、もう 1 つのファイルは空白が %20 に置き換えられます。空白が置き換えられたファイル (%20) のみが正しい XML コンテンツを持っているようです。URL エンコーディングに関連しているようですが、どこで発生しているのかわかりません。

public String export(Context ctx) {
    DocumentBuilderFactory icFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder icBuilder;
    try {
        icBuilder = icFactory.newDocumentBuilder();
        Document doc = icBuilder.newDocument();
        Element mainRootElement = doc.createElement("deck");
        mainRootElement.setAttribute("game",
                "0f38e453-26df-4c04-9d67-6d43de939c77");
        doc.appendChild(mainRootElement);

        // identity card is located on top of the XML file

        // identity section
        Element identitySection = doc.createElement("section");
        identitySection.setAttribute("name", CardTypes.IDENTITY);
        mainRootElement.appendChild(identitySection);
        identitySection
                .appendChild(createNode(doc, 1, identity.getTitle()));

        // stack / r&d section
        Element deckSection = doc.createElement("section");
        deckSection.setAttribute("name", "R&D / Stack");
        // add all the cards!
        for (DeckItem item : cards) {
            NRCard card = item.getCard();
            deckSection.appendChild(createNode(doc, item.getAmount(),
                    card.getTitle()));
        }
        mainRootElement.appendChild(deckSection);

        Transformer transformer = TransformerFactory.newInstance()
                .newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        DOMSource source = new DOMSource(doc);
        if (Utilities.ExternalStorageWritable()) {
            String root = Environment.getExternalStorageDirectory()
                    .toString();
            File f = new File(root + "/TheToolbox/decks/" + this.deckName
                    + ".o8d");
            if (!f.getParentFile().exists())
                f.getParentFile().mkdirs();
            if (!f.exists())
                f.createNewFile();

            Result result = new StreamResult(f);
            transformer.transform(source, result);
            System.out.println("Export completed");
        } else {
            throw new Exception("External storage not writable");
        }
    } catch (Exception e) {
        Log.e("TB error", e.getMessage());
    }

    return this.deckName;
}
4

1 に答える 1

1

私の問題を見つけました!

実際には、新しいファイルを作成するために 2 つの呼び出しがありました。

if (!f.exists())
    f.createNewFile();

Result result = new StreamResult(f);
transformer.transform(source, result);

ファイル名に空白がなければ、両方とも同じファイルを扱っていたため、すべてうまくいきました。ただし、空白を使用すると、StreamResult はファイル名を URL としてエンコードします (したがって、%20 でスペースを置き換えます) が、createNewFile() はエンコードしません。修正は簡単でした。私は

f.createNewFile();

行と追加:

result.setSystemId(java.net.URLDecoder.decode(result.getSystemId(), "UTF-8"));

したがって、ファイル名をスペースで正しく記述します。

于 2013-09-11T12:58:38.550 に答える