我的处理程序类:
package csc241hw06;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* Created by Dan1 on 3/9/2017.
*/
public class MyHandler extends DefaultHandler {
private Customer customer;
private Account account;
private Address address;
private Meter meter;
private MeterReading meterReading;
private ArrayList <Customer> customerArrayList;
private ArrayList <Address> addressList;
String lastName;
String firstName;
String addressType;
String accountNum;
String accountType;
public MyHandler() {
customerArrayList = new ArrayList <Customer> ();
addressList = new ArrayList <Address> ();
}
public ArrayList <Customer> getCustomerList() {
return customerArrayList;
}
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if ( qName.equalsIgnoreCase ( "Customer" ) ) {
lastName = attributes.getValue ( "lastName" );
firstName = attributes.getValue ( "firstName" );
} else if ( qName.equalsIgnoreCase ( "account" ) ) {
accountType = attributes.getValue ( "type" );
accountNum = attributes.getValue ( "accountNumber" );
if ( accountType.equalsIgnoreCase ( "residential" ) ) {
account = new ResidentialAccount ( accountNum, customer );
} else {
account = new CommercialAccount ( accountNum, customer );
}
} else if ( qName.equalsIgnoreCase ( "address" ) ) {
String unit = attributes.getValue ( "unit" );
String street = attributes.getValue ( "street" );
String number = attributes.getValue ( "number" );
String zipCode = attributes.getValue ( "zipCode" );
int parseNum = Integer.parseInt ( number );
if ( attributes.getValue ( "type" ).equals ( "mailing" ) ) {
if ( attributes.getValue ( "unit" ) == null ) {
if ( accountType.equalsIgnoreCase ( "residential" ) ) {
address = new Residence ( parseNum, street, zipCode );
} else {
address = new Commercial ( parseNum, street, zipCode );
}
} else {
address = new Apartment ( parseNum, street, zipCode, unit );
}
if ( customer == null ) {
customer = new Customer ( lastName, firstName, address );
}
} else if ( attributes.getValue ( "type" ).equalsIgnoreCase ( "apartment" ) ) {
address = new Apartment ( parseNum, street, zipCode, unit );
} else if ( attributes.getValue ( "type" ).equalsIgnoreCase ( "commercial" ) ) {
address = new Commercial ( parseNum, street, zipCode );
} else if ( attributes.getValue ( "type" ).equalsIgnoreCase ( "house" ) ) {
address = new Residence ( parseNum, street, zipCode );
}
} else if ( qName.equalsIgnoreCase ( "meter" ) ) {
String id = attributes.getValue ( "id" );
String brand = attributes.getValue ( "brand" );
String meterType = attributes.getValue ( "type" );
String location = attributes.getValue ( "location" );
if ( meterType.equalsIgnoreCase ( "push" ) ) {
meter = new PushMeter ( id, brand );
} else if ( meterType.equalsIgnoreCase ( "poll" ) ) {
meter = new PollMeter ( id, brand );
}
meter.setLocation ( address, location );
} else if ( qName.equalsIgnoreCase ( "meterReading" ) ) {
String reading = attributes.getValue ( "reading" );
String date = attributes.getValue ( "date" );
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "yyyy-MM-dd'T'HH:mm" );
LocalDateTime dateTime = LocalDateTime.parse ( date, formatter );
String flag = attributes.getValue ( "flag" );
meterReading = new MeterReading ( Double.parseDouble ( reading ), dateTime, flag, meter );
}
}
public void endElement(String uri, String localName, String qName) throws SAXException {
if ( qName.equalsIgnoreCase ( "customer" ) ) {
customerArrayList.add ( customer );
} else if ( qName.equalsIgnoreCase ( "account" ) ) {
customer.addAccount ( account );
account.updateBalance ();
} else if ( qName.equalsIgnoreCase ( "address" ) ) {
addressList.add ( address );
for (int i = 0; i < addressList.size (); i++) {
account.addAddress ( addressList.get ( i ) );
}
addressList = new ArrayList <Address> ();
} else if ( qName.equalsIgnoreCase ( "meter" ) ) {
address.addMeter ( meter );
} else if ( qName.equalsIgnoreCase ( "meterReading" ) ) {
meter.addReading ( meterReading );
}
}
}
我的xml文件:
<customer lastName ="Adams" firstName="Maurice">
<address type="mailing" unit="308" street="W 4th St." number="56" zipCode="13126"/>
<account type="residential" accountNumber="876-543-21">
<address type="apartment" unit="308" street="W 4th St." number="56" zipCode="13126">
<meter id = "RM-4877-X4" brand="GE" type="push" location = "East side of building">
<meterReading reading="650" date = "2016-12-31T00:31" flag="push"/>
<meterReading reading="675" date = "2017-01-01T00:37" flag="push"/>
<meterReading reading="622" date = "2017-01-02T00:38" flag="push"/>
</meter>
</address>
</account>
</customer>
<customer lastName ="Costanza" firstName="George">
<address type="mailing" street="E 5th St." number="65" zipCode="13126"/>
<account type="commercial" accountNumber="765-432-10">
<address type="commercial" street="Albany St." number="56" zipCode="13126">
<meter id = "CM-7784-D1" brand="GE" type="poll" location = "North entrance">
<meterReading reading="5043" date = "2016-12-31T00:32" flag="poll"/>
<meterReading reading="6152" date = "2017-01-01T00:38" flag="poll"/>
<meterReading reading="7261" date = "2017-01-02T00:41" flag="poll"/>
</meter>
</address>
<address type="commercial" street="Oneida St." number="72" zipCode="13126">
<meter id = "CM-7684-D2" brand="GE" type="push" location = "South end of basement">
<meterReading reading="650" date = "2016-12-31T00:21" flag="push"/>
<meterReading reading="760" date = "2017-01-01T00:23" flag="push"/>
<meterReading reading="781" date = "2017-01-02T00:25" flag="push"/>
<meterReading reading="722" date = "2017-01-03T00:27" flag="push"/>
</meter>
</address>
</account>
</customer>
</xml>
问题是,每次我尝试将地址添加到地址列表时,都会在endElement方法中返回错误。是的,这是一个家庭作业,我已经尝试了一切,并且不知道还有谁问(我的老师目前没什么帮助),非常感谢任何帮助,谢谢