Ваш входной XML недействителен. Это должно быть:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE favoris [
<!ELEMENT favoris (station)+>
<!ELEMENT station (#PCDATA)>
<!ATTLIST station id ID #REQUIRED>
]>
<favoris>
<station id="i5">test1</station>
<station id="i6">test1</station>
<station id="i8">test1</station>
</favoris>
Поскольку @DevNull пишет, что оно полностью допустимо, вы не можете написать <station id="5">test1</station>
(однако для Java это работает в любом случае, даже с этой проблемой).
DOCTYPE
стирается в выходном XML-документе:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<favoris>
<station id="i5">new value</station>
<station id="i6">test1</station>
<station id="i8">test1</station>
</favoris>
Я еще не нашел решения для отсутствия DTD, но в качестве обходного пути вы можете установить внешнее DTD:
xformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "favoris.dtd");
Результат (пример) документа:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE favoris SYSTEM "favoris.dtd">
<favoris>
<station id="i5">new value</station>
<station id="i6">test1</station>
<station id="i8">test1</station>
</favoris>
EDIT:
Я не думаю, что возможно сохранить встроенный DTD, используя Transformer
класс (смотри здесь ). Если вы не можете использовать внешнюю ссылку DTD, вы можете вместо этого использовать класс DOM 3 LSSerializer
:
DOMImplementationLS domImplementationLS =
(DOMImplementationLS) dom.getImplementation().getFeature("LS","3.0");
LSOutput lsOutput = domImplementationLS.createLSOutput();
FileOutputStream outputStream = new FileOutputStream("output.xml");
lsOutput.setByteStream((OutputStream) outputStream);
LSSerializer lsSerializer = domImplementationLS.createLSSerializer();
lsSerializer.write(dom, lsOutput);
outputStream.close();
Вывод с требуемым DTD (я не вижу возможности добавить standalone="yes"
, используя LSSerializer
...):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE favoris [<!ELEMENT favoris (station)+>
<!ELEMENT station (#PCDATA)>
<!ATTLIST station id ID #REQUIRED>
]>
<favoris>
<station id="i5">new value</station>
<station id="i6">test1</station>
<station id="i8">test1</station>
</favoris>
Другой подход - использовать Apache Xerces2-J XMLSerializer
класс:
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
...
XMLSerializer serializer = new XMLSerializer();
serializer.setOutputCharStream(new java.io.FileWriter("output.xml"));
OutputFormat format = new OutputFormat();
format.setStandalone(true);
serializer.setOutputFormat(format);
serializer.serialize(dom);
Результат:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE favoris [<!ELEMENT favoris (station)+>
<!ELEMENT station (#PCDATA)>
<!ATTLIST station id ID #REQUIRED>
]>
<favoris>
<station id="i5">new value</station>
<station id="i6">test1</station>
<station id="i8">test1</station>
</favoris>