Читать «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.