DOMのSAXまたはStAXをAPIの(単純な)単純化のために選択します。はい、DOMを実装するための定型コードがいくつかありますが、いったんそれを超えるとかなり簡単になります。
XMLソースが100または1000メガバイトの場合、ストリーミングAPIの1つがより適していると言われています。
import java.io.File;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;
public class ChangeVersion
{
public static void main(String[] args)
throws Exception
{
if (args.length < 3) {
System.err.println("Usage: ChangeVersion <input> <output> <new version>");
System.exit(1);
}
File inputFile = new File(args[0]);
File outputFile = new File(args[1]);
int updatedVersion = Integer.parseInt(args[2], 10);
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = domFactory.newDocumentBuilder();
Document doc = docBuilder.parse(inputFile);
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
XPathExpression expr = xpath.compile("/PremiereData/Project/@Version");
NodeList versionAttrNodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < versionAttrNodes.getLength(); i++) {
Attr versionAttr = (Attr) versionAttrNodes.item(i);
versionAttr.setNodeValue(String.valueOf(updatedVersion));
}
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new DOMSource(doc), new StreamResult(outputFile));
}
}
あなたはファイル全体を持っていないかのようにまあ「部分読み取り」として本物のようなもの何もない、それはおそらく不適切にフォーマットさポータルであるため、解析できないだろう、それはパースない場合その属性にアクセスすることはできません。そのような小さな編集のためには、ファイル全体を文字列として読み込み(デシリアライズしようとするよりもはるかに高速)、文字列置換/パターン検索を行うだけです。 – Wobbles
@Wobblesうまくいきません。SAXとStAXパーサは、ドキュメント全体をメモリにロードしたくない正確なシナリオ用に構築されています。 –
もちろん、部分的に読むこともできます。しかし、部分的な書き込み(ファイルの末尾に追加する場合を除く)はありません。 – Kayaman