編集:私の問題を見つけました!
私の問題を見つけました!
実際には、新しいファイルを作成するために 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;
}