Вот программа для чтения (String xml - это имя вашего XML-файла):
public boolean readXML(String xml) { rolev = new ArrayList<String>(); Document dom; // Make an instance of the DocumentBuilderFactory DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { // use the factory to take an instance of the document builder DocumentBuilder db = dbf.newDocumentBuilder(); // parse using the builder to get the DOM mapping of the // XML file dom = db.parse(xml);
Element doc = dom.getDocumentElement();
role1 = getTextValue(role1, doc, "role1"); if (role1 != null) { if (!role1.isEmpty()) rolev.add(role1); } role2 = getTextValue(role2, doc, "role2"); if (role2 != null) { if (!role2.isEmpty()) rolev.add(role2); } role3 = getTextValue(role3, doc, "role3"); if (role3 != null) { if (!role3.isEmpty()) rolev.add(role3); } role4 = getTextValue(role4, doc, "role4"); if ( role4 != null) { if (!role4.isEmpty()) rolev.add(role4); } returntrue;
// instance of a DocumentBuilderFactory DocumentBuilderFactorydbf= DocumentBuilderFactory.newInstance(); try { // use factory to get an instance of document builder DocumentBuilderdb= dbf.newDocumentBuilder(); // create instance of DOM dom = db.newDocument();
// create the root element ElementrootEle= dom.createElement("roles");
// create data elements and place them under root e = dom.createElement("role1"); e.appendChild(dom.createTextNode(role1)); rootEle.appendChild(e);
e = dom.createElement("role2"); e.appendChild(dom.createTextNode(role2)); rootEle.appendChild(e);
e = dom.createElement("role3"); e.appendChild(dom.createTextNode(role3)); rootEle.appendChild(e);
e = dom.createElement("role4"); e.appendChild(dom.createTextNode(role4)); rootEle.appendChild(e);
Приведенный выше ответ касается только парсера DOM (который обычно считывает весь файл в памяти и анализирует его, что для большого файла является проблемой), вы могли бы использовать парсер SAX, который использует меньше памяти и работает быстрее (в любом случае, это зависит от вашего кода).
SAX parser выполняет обратный вызов некоторых функций, когда находит начало элемента, конец элемента, атрибут, текст между элементами и т.д., Поэтому он может проанализировать документ, и в то же время вы получите то, что вам нужно.
Ответы касаются только DOM / SAX и реализации copy paste примера JAXB.
Однако при использовании XML отсутствует одна большая область. Во многих проектах / программах необходимо сохранять / извлекать некоторые базовые структуры данных. В вашей программе уже есть классы для ваших красивых и блестящих бизнес-объектов / структур данных, вам просто нужен удобный способ преобразования этих данных в XML-структуру, чтобы вы могли творить с ними больше волшебства (хранить, загружать, отправлять, манипулировать с помощью XSLT).
Вот где XStream блистает. Вы просто аннотируете классы, содержащие ваши данные, или, если вы не хотите изменять эти классы, вы настраиваете экземпляр XStream для маршалинга (objects -> xml) или демаршалинга (xml -> objects).
Внутренне XStream использует reflection, методы readObject и readResolve стандартной сериализации объектов Java.
Чтобы дать краткий обзор того, как это работает, я также привожу несколько примеров кода, который маршалирует и разархивирует структуру данных. Маршалинг / демаршалинг происходит полностью в main методе, остальное - это просто код для генерации некоторых тестовых объектов и заполнения в них некоторых данных. Настроить xStream экземпляр очень просто, а маршалинг / разархивирование выполняется с помощью одной строки кода каждая.