(InputStream), то використовується він. Якщо встановлена ​​кодування методом setEncoding (), то використовується вона, а якщо ні - то парсер використовує кодування, зазначену в заголовку XML-документа. p> Якщо при читанні заголовка XML-документа виявляється розбіжність між заданої кодуванням і кодуванням із заголовка, то парсери можуть чинити по різному. Crimson, наприклад, при цьому видає попередження, а Xerces мовчки пропускає. p> З читанням XML-документів ми розібралися, тепер перейдемо до їх створення. Єдиного стандарту на створення документів, на відміну від читання, поки немає. Передбачається, що, наступна версія рекомендацій комітету W3C буде включати в себе і створення документів, але поки що творці парсерів роблять хто на що здатний. p> У випадку з Crimson зберегти створений документ DOM можна за допомогою методу write () у класу org.apache.crimson.tree.XmlDocument. В якості аргументу можна передати або потік символів (Writer) або потік байтів (OutputStream). Разом з потоком можна передати і необхідне кодування. Якщо використаний потік байтів, а кодування вказана не була, то використовується UTF-8. Якщо використаний потік символів разом з ім'ям кодування, то ім'я використовується тільки для запису в заголовок документа. Якщо Writer переданий без кодування, то робиться перевірка - Якщо це екземпляр OutputStreamWriter, то для з'ясування що писати в заголовок зветься його метод getEncoding (). Якщо ж це інший Writer, то кодування в заголовок записана не буде, що за стандартом означає кодування UTF-8. Приклад: p> XmlDocument doc = ...;
OutputStream os = ...;
doc.write (os, "Windows-1251");
У Xerces для створення документів використовуються класи з пакета org.apache.xml.serialize. Власне для запису використовується клас XMLSerializer, а для настройки вихідного формату - клас OutputFormat. У конструкторі XMLSerializer можна передавати як потоки байтів, так і потоки символів. У разі потоків символів використовувана кодування повинна збігатися з заданої в OutputFormat. Важливо не забути задати використовувану кодування в OutputFormat - в іншому випадку російські літери будуть представлені у вигляді кодів, типу такого: "АБВ" для символів "АБВ". Приклад:
OutputStream os = ...;
OutputFormat format = new OutputFormat (Method.XML, "Windows-1251", true)
XMLSerializer serializer = new XMLSerializer (os, format);
serializer.serialize (doc);
Castor XML
Пакет Castor призначений для вирішення проблем довготривалого зберігання об'єктів. У числі іншого він містить у собі підсистему Castor XML, яка по суті справи є надбудовою над XML-парсером і дозволяє автоматизувати читання і запис XML-файлів. Castor XML за замовчуванням використовує парсер Xerces, тому проблеми Xerces перекочовують і сюди. У документації до Castor в прикладах використовуються потоки символів (Reader і Writer), а це може призвести до рассогласованности між використовуваної ...