Вы можете использовать преобразование идентичности JAXP, что-то вроде этого:
javax.xml.transform.Source xmlSource =
new javax.xml.transform.stream.StreamSource(xmlFile);
javax.xml.transform.Result result =
new javax.xml.transform.stream.StreamResult(System.out);
javax.xml.transform.TransformerFactory transFact =
javax.xml.transform.TransformerFactory.newInstance();
javax.xml.transform.Transformer trans =
transFact.newTransformer();
trans.setOutputProperty("indent", "yes")
trans.transform(xmlSource, result);
Если повезет, это будет потоковое преобразование (оно обязательно будет, если TransformerFactory - Saxon).
Вы могли бы расширить этот подход, чтобы вставить потоковый шаг проверки в конвейер, избегая необходимости делать два прохода по данным. Если вы делаете все это в Саксонии, дополнительный бонус заключается в том, что отступы будут чувствительны к схеме - гарантируя, что отступы никогда не нарушат достоверность схемы.
Однако, хотя это соответствует заявленному требованию, я не уверен, что оно достигнет основных целей. Отступы сделаны, чтобы сделать данные удобочитаемыми. Рассматривали ли вы, какие инструменты вы будете использовать для отображения и редактирования вручную документа объемом 4 ГБ? Я не могу думать ни о ком, кто сделает работу, и удобство использования было бы ужасно. Кроме того, документ 4Gb, скорее всего, генерируется машиной, поэтому, если он недействителен, вам нужно исправить созданную им программу, а не сами данные - вполне вероятно, что любые ошибки в данных будут повторяться систематически много раз.