Мне нужно создать класс для извлечения данных из XML-файла invoice.xml, который я создал. В xml клиент может купить более одного товара. Проблема при печати извлеченных данных заключается в том, что в этом случае будет напечатан только последний элемент, купленный клиентом.
Кто-нибудь может предложить решение? Я также приложу свой XML-файл, потому что я почти уверен, что именно в этом проблема.
SAXParserExample.java
package Attempt2;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXParserExample extends DefaultHandler {
List<Invoice> myInvoices;
private String tempVal;
private Invoice tempInv;
public SAXParserExample() {
myInvoices = new ArrayList<Invoice>();
}
public void runExample() {
parseDocument();
printData();
}
private void parseDocument() {
SAXParserFactory spf = SAXParserFactory.newInstance();
try {
SAXParser sp = spf.newSAXParser();
sp.parse("invoice.xml", this);
} catch (SAXException se) {
se.printStackTrace();
} catch (ParserConfigurationException pce) {
pce.printStackTrace();
} catch (IOException ie) {
ie.printStackTrace();
}
}
private void printData() {
System.out.println("\n\n\tNo of Invoices '" + myInvoices.size()
+ "'.\n");
Iterator<Invoice> it = myInvoices.iterator();
while (it.hasNext()) {
System.out.println("\n\t" + it.next().toString());
}
}
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
tempVal = "";
if (qName.equalsIgnoreCase("Invoice")) {
tempInv = new Invoice();
}
}
public void characters(char[] ch, int start, int length)
throws SAXException {
tempVal = new String(ch, start, length);
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (qName.equalsIgnoreCase("invoice")) {
myInvoices.add(tempInv);
} else if (qName.equalsIgnoreCase("invoicenum")) {
tempInv.setInvoiceNum(tempVal);
} else if (qName.equalsIgnoreCase("title")) {
tempInv.setTitle((tempVal));
} else if (qName.equalsIgnoreCase("name")) {
tempInv.setName((tempVal));
} else if (qName.equalsIgnoreCase("street")) {
tempInv.setStreet((tempVal));
} else if (qName.equalsIgnoreCase("city")) {
tempInv.setCity((tempVal));
} else if (qName.equalsIgnoreCase("county")) {
tempInv.setCounty((tempVal));
} else if (qName.equalsIgnoreCase("postal")) {
tempInv.setPostal((tempVal));
} else if (qName.equalsIgnoreCase("description")) {
tempInv.setDescription((tempVal));
} else if (qName.equalsIgnoreCase("price")) {
tempInv.setPrice((tempVal));
} else if (qName.equalsIgnoreCase("quantity")) {
tempInv.setQuantity((tempVal));
}
}
public static void main(String[] args) {
SAXParserExample spe = new SAXParserExample();
spe.runExample();
}
}
invoice.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE people SYSTEM "invoice.dtd">
<invoices>
<invoice>
<invoicenum>Invoice# 12345</invoicenum>
<address>
<title>Customer Address</title>
<name>William Owen</name>
<street>99 Anywhere Avenue</street>
<city>Bangor</city>
<county>Gwynedd</county>
<postal>LL57 3JP</postal>
</address>
<items>
<order>Items Ordered</order>
<item>
<description>Ink Jet Refill Kit</description>
<price>29.50</price>
<quantity>2</quantity>
</item>
<item>
<description>4-Port Mini Hub</description>
<price>19.95</price>
<quantity>1</quantity>
</item>
</items>
</invoice>
<invoice>
<invoicenum>Invoice# 12346</invoicenum>
<address>
<title>Customer Address</title>
<name>Alex Gavra</name>
<street>14 Menai View Terrace</street>
<city>Bangor</city>
<county>Gwynedd</county>
<postal>LL57 2HF</postal>
</address>
<items>
<order>Items Ordered</order>
<item>
<description>200GB External Disk Drive</description>
<price>83.50</price>
<quantity>1</quantity>
</item>
</items>
</invoice>
<invoice>
<invoicenum>Invoice# 12347</invoicenum>
<address>
<title>Customer Address</title>
<name>Mark Reeves</name>
<street>Neuadd Llys Trifan</street>
<city>Bangor</city>
<county>Gwynedd</county>
<postal>LL57 2JS</postal>
</address>
<items>
<order>Items Ordered</order>
<item>
<description>19 Inch LCD Monitor LG</description>
<price>120</price>
<quantity>1</quantity>
</item>
<item>
<description>Wireless mouse Laser Microsoft</description>
<price>17.55</price>
<quantity>1</quantity>
</item>
</items>
</invoice>
<invoice>
<invoicenum>Invoice# 12348</invoicenum>
<address>
<title>Customer Address</title>
<name>Nick Murray</name>
<street>10 Some Street</street>
<city>London</city>
<county>London</county>
<postal>WC1</postal>
</address>
<items>
<order>Items Ordered</order>
<item>
<description>Microsoft keyboard SF200</description>
<price>60.50</price>
<quantity>1</quantity>
</item>
<item>
<description>Screen cleaner spray</description>
<price>4.59</price>
<quantity>3</quantity>
</item>
<item>
<description>Office chair</description>
<price>149.99</price>
<quantity>1</quantity>
</item>
</items>
</invoice>
<invoice>
<invoicenum>Invoice# 12349</invoicenum>
<address>
<title>Customer Address</title>
<name>Michael Jones</name>
<street>Somewhere Street 18</street>
<city>London</city>
<county>London</county>
<postal>E17</postal>
</address>
<items>
<order>Items Ordered</order>
<item>
<description>PLX Elastic Bands</description>
<price>15.73</price>
<quantity>1</quantity>
</item>
</items>
</invoice>
</invoices>
Кроме того, после создания моего java-класса я получаю следующее сообщение в своем XML-документе, в который вставлено более одного элемента:
![enter image description here](https://i.stack.imgur.com/PoKpF.jpg)
У меня мало знаний о DTD, но вот что я написал:
invoice.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT invoices (invoice*)>
<!ELEMENT invoice (invoicenum, address, items)>
<!ELEMENT address (title, name, street, city, county, postal)>
<!ELEMENT items (order, item)>
<!ELEMENT item (description, price, quantity)>
<!ELEMENT invoicenum (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT street (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT county (#PCDATA)>
<!ELEMENT postal (#PCDATA)>
<!ELEMENT order (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT quantity (#PCDATA)>
Кроме того, я присоединяю класс Invoice.java на случай, если может быть подсказка для решения этой проблемы.
package Attempt2;
public class Invoice {
private String invoicenum;
private String title;
private String name;
private String street;
private String city;
private String county;
private String postal;
private String order;
private String description;
private String price;
private String quantity;
public Invoice() {
System.out.println("\n\t No Arg Invoice Constructor Called…");
}
public Invoice(String invoicenum, String title, String name, String street,
String city, String county, String postal, String order,
String description, String price, String quantity) {
System.out.println("\n\t 4-Argument Invoice Constructor Called…");
this.invoicenum = invoicenum;
this.title = title;
this.name = name;
this.street = street;
this.city = city;
this.county = county;
this.postal = postal;
this.order = order;
this.description = description;
this.price = price;
this.quantity = quantity;
}
public String getInvoiceNum() {
return invoicenum;
}
public void setInvoiceNum(String invoicenum) {
this.invoicenum = invoicenum;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// street
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
// city;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
// county
public String getCounty() {
return county;
}
public void setCounty(String county) {
this.county = county;
}
// postal
public String getPostal() {
return postal;
}
public void setPostal(String postal) {
this.postal = postal;
}
// order
public String getOrder() {
return order;
}
public void setOrder(String order) {
this.order = order;
}
// description
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
// price
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
// quantity
public String getQuantity() {
return quantity;
}
public void setQuantity(String quantity) {
this.quantity = quantity;
}
/**
private String title;
private String order;
*/
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("Invoice Details \n---------------------------------\n");
sb.append("Invoice Number:" + getInvoiceNum()+"\n");
sb.append("Name:" + getName()+"\n");
sb.append("Street:" + getStreet()+"\n");
sb.append("City:" + getCity()+"\n");
sb.append("County:" + getCounty()+"\n");
sb.append("Postal Code:" + getPostal()+"\n");
sb.append("Item Description:" + getDescription()+"\n");
sb.append("Price:" + getPrice()+"\n");
sb.append("Quantity:" + getQuantity()+"\n");
return sb.toString();
}
}