Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 477
Ильдар Шаукатович Хабибуллин
}
}
private void processText(String text){ if (inBirthday){
person.setBirthday(text); inBirthday = false;
}else if (inStreet){
address.setStreet(text) ; inStreet = false;
}else if (inCity) {
address.setCity(text); inCity = false;
}else if (inZip){
address.setZip(text); inZip = false;
}else if (inWorkPhone){ person.addWorkPhone(text); inWorkPhone = false;
}else if (inHomePhone){ person.addHomePhone(text); inHomePhone = false;
}
}
private void finishElement(String name){ switch (name){
case "address": person.addAddre s s(addre ss);
address = null; break; case "person": pers.add(person); person = null; break;
}
}
public static void main(String[] args){ if (args.length < 1){
System.err.println("Usage: java NotebookHandlerStAX ntb.xml");
System.exit(1);
}
NotebookHandlerStAX handler = new NotebookHandlerStAX(); try{
FileInputStream inStream = new FileInputStream(args[0]);
XMLStreamReader xmlReader =
XMLInputFactory.newInstance(). createXMLStreamReader(inStream) ; int event;
while (xmlReader.hasNext()) { event = xmlReader.next(); switch (event){
case START_ELEMENT: handler.processElement(xmlReader); break; case CHARACTERS: handler.processText(xmlReader.getText()); break; case END_ELEMENT: handler.finishElement(xmlReader.getLocalName());
}
}
xmlReader.close() ;
}catch(Exception ex){ ex.printStackTrace() ;
}
}
}
Связывание данных XML с объектами Java
В приведенном примере мы сами создали классы Address и Person, представляющие документ XML. Поскольку структура документа XML четко определена, можно разработать стандартные правила связывания данных XML с объектами Java и создать программные средства для их реализации.
Корпорация Sun Microsystems разработала пакет интерфейсов и классов JAXB (Java Architecture for XML Binding), облегчающих связывание данных. Он входит в стандартную поставку Java SE, а также может быть скопирован с сайта http:// jaxb.dev.java.net/. Для работы с пакетом JAXB анализируемый документ XML обязательно должен быть снабжен описанием на языке XSD.
В состав пакета JAXB входит компилятор xj c (XML-Java Compiler). Он просматривает схему XSD и строит по нему объекты Java в оперативной памяти, а также создает исходные файлы объектов Java. Например, после выполнения команды
$ xjc -roots notebook ntb.xsd -d sources
в которой ntb.xsd — файл листинга 28.4 — в каталоге sources (по умолчанию в текущем каталоге) будут созданы файлы Addressjava, Namejava, Notebookjava, Personjava, PhoneListjava с описаниями объектов Java.
Флаг -roots показывает один или несколько корневых элементов, разделенных запятыми.
Созданные компилятором xjc исходные файлы обычным образом, с помощью компилятора j avac, компилируются в классы Java.
Получив объекты данных, можно перенести в них содержимое документа XML методом unmarshal (), который создает дерево объектов, или, наоборот, записать объекты Java в документы XML методом marshal (). Эти методы уже записаны в созданный компилятором xj c класс корневого элемента, в примере это класс Notebook.