Электронный магазин на Java и XML

       

Класс 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>" ); }

}

 




Содержание раздела