Класс ProductLine
Следующий класс, ProductLine, основан на определении DTD для элемента productline:
<!ELEMENT product_line (product*) > <!ATTLIST product_line name CDATA #IMPLIED>
Как и в элементе catalog, в этом элементе содержится один повторяющийся дочерний элемент. Поэтому и здесь мы применяем для представления этих дочерних элементов вектор Vector, как показано в листинге 6.12. У этого элемента имеется атрибут name, для которого тоже необходимо создать представление в классе. Добавим поле, имеющее тип Srting. Тип String обычно хорошо подходит для элементов CDATA.
Листинг 6.12. Начало кода класса ProductLine (ProductLine.java)
package com.XmlEcomBook.Chap06;
import java.util.*; import java.io.*;
import org.w3c.dom.*;
public class ProductLine extends Object {
private String name; private Vector products = new Vector();
Для этого класса у нас имеются два конструктора. Первый конструктор не имеет аргументов и просто создает пустой объект ProductLine для представления
серии товаров без указания имени и товаров. Второй конструктор этого класса использует объект DOM Element. Вы уже видели, что Element передается конструктору классом Catalog. Этот конструктор должен быть способен получить атрибут name этого элемента, а затем найти все дочерние элементы, соответствующие товарам данной серии, и создать новые элементы Product на их основе. Эти конструкторы показаны в листинге 6.13.
Листинг 6.13. Конструкторы ProductLine (ProductLine.java)
public ProductLine() { }
public ProductLine( Element element ) { name = element.getAttribute( "name" ); NodeList productNodes = element.getElementsByTagName( "product" ); int num = productNodes.getLength(); for( int i = 0; i < num; i++ ) { addProduct( new Product( (Element)productNodes.item( i ) ) ); } }
Теперь перейдем к методам, открывающим доступ к элементам Product и позволяющим их модифицировать. Они аналогичны методам элемента Catalog, которые использовались для вектора, состоящего из элементов ProductLine. Один метод, показанный в листинге 6.14, требуется для получения элементов (товаров) по их имени, другой — для удаления элементов и еще один — для их добавления в каталог.
Листинг 6.14. Методы для получения и модификации элементов Product (ProductLine.java)
public void addProduct( Product product ) { products.addElement( product ); }
public Product deleteProduct( String id ) { Enumeration enum = products.elements(); while( enum.hasMoreElements() ) { Product p = (Product)enum.nextElement(); if( p.getId().equals( id ) ) { products.remove( p ); return p; } } return null; }
public Product getProduct( String id ) { Enumeration enum = products.elements(); while( enum.hasMoreElements() ) { Product p = (Product)enum.nextElement(); if( p.getId().equals( id ) ) { return p; } } return null; }
Также необходимо иметь возможность получать доступ к полю name элемента Product и модифицировать это поле, как показано в листинге 6.15.
Листинг 6.15. Методы для получения и модификации имени элементов Product (ProductLine.java)
public String getName(){ return name; }
public void setName( String newName ) { name = newName; }
Наконец, нам нужен метод для записи данных в формате XML. Этот метод приведен в листинге 6.16. Как и в классе Catalog, здесь имеется метод с названием toXML, который записывает код XML в указанный объект класса XMLWriter. В этот раз нам также нужно записать атрибут элемента name. В XML разрешается помещать значения атрибутов либо в одинарные, либо в двойные кавычки. То есть вы можете написать name = "ABC" или name = 'ABC' — обе записи эквивалентны. Чтобы упростить вывод данных в формате XML, следует пользоваться одинарными кавычками, так как при введении двойных кавычек их придется снабжать обратной косой чертой, что затрудняет восприятие кода.
Листинг 6.16. Запись данных ProductLine в формате XML (ProductLine.java)
public void toXML( XMLWriter writer ) throws IOException { writer.write( "<product_line" ); if( name != null ) writer.write( " name='" + name ); writer.writeln( "'>" ); writer.indent(); Enumeration enum = products.elements(); while( enum.hasMoreElements() ) { Product p = (Product)enum.nextElement(); p.toXML( writer ); writer.writeln( "" ); } writer.unindent(); writer.writeln( "</product_line>" ); }
}