Я новичок, изучающий, как выполнять синтаксический анализ XML, и получил домашнюю работу по анализу XML-файла с использованием Java.
Это XML-файл:
<?xml version="1.0" ?>
<deliveries>
<van id="VID-12345">
<package>
<product taxable="true" productName="Headphones" isbn="123456" unitPrice="10.00" quantity="1"/>
<product taxable="false" productName="Milk" isbn="234567" unitPrice="2.00" quantity="2"/>
<customer lastName="Adams" firstName="Maurice" streetAddress="123 4th St" zipCode="13126" accountNumber="ACCT-54321"/>
</package>
<package>
<product taxable="true" productName="Snickers" isbn="345678" unitPrice="1.00" quantity="1"/>
<product taxable="false" productName="Milk" isbn="234567" unitPrice="2.00" quantity="1"/>
<customer lastName="Baxter" firstName="Robert" streetAddress="234 5th St" zipCode="13126" accountNumber="ACCT-65432"/>
</package>
</van>
<cart id="VID-23456">
<package>
<product taxable="true" productName="Snickers" isbn="345678" unitPrice="1.00" quantity="1"/>
<customer lastName="Charles" firstName="Steven" streetAddress="345 6th St" zipCode="13126" accountNumber="ACCT-76543"/>
</package>
</cart>
</deliveries>
Мне нужно проанализироватьэто будет выглядеть так:
Van (VID-12345)
Customers
Adams, Maurice at 123 4th St, 13126
Baxter, Robert at 234 5th St, 13126
Total
$17.00
Cart (VID-23456)
Customers
Charles, Steven at 345 6th St, 13126
Total
$1.00
Как мне разобрать его, чтобы он выглядел как предложенный формат? Я прочитал много уроков и примеров, но не смог найти того, который мог бы мне помочь. Из всего, что я прочитал, я думаю, что это связано с составлением списка или созданием объектов для анализа. Я также не могу понять, как рассчитать «Итого» (который является суммой unitPrice * количества всех предметов в каждом «Пакете»). Решение было бы неплохо, но подробный совет (или соответствующая ссылка на учебник) также поможет мне. Я был бы очень признателен за любую помощь. Это код, над которым я сейчас работаю:
public class MyHandler extends DefaultHandler {
@Override
public void startDocument() throws SAXException {
System.out.println("---=== Report ===---");
}
@Override
public void endDocument() throws SAXException {
System.out.println("---=== End of Report ===---");
}
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("van")) {
System.out.println("Van (" + attributes.getValue("id") + ")");
}
if (qName.equalsIgnoreCase("customer")) {
System.out.println(" Customer");
System.out.println(" " + attributes.getValue("lastName") + ", " + attributes.getValue("firstName") + " at " + attributes.getValue("streetAddress") + ", " + attributes.getValue("zipCode"));
}
if (qName.equalsIgnoreCase("cart")) {
System.out.println("Cart (" + attributes.getValue("id") + ")");
}
if (qName.equalsIgnoreCase("product")) {
double sum = Double.parseDouble(attributes.getValue("unitPrice")) * Integer.parseInt(attributes.getValue("quantity"));
System.out.println(sum);
}
}
}
Результат (неверный):
---=== Report ===---
Van (VID-12345)
10.0
4.0
Customer
Adams, Maurice at 123 4th St, 13126
1.0
2.0
Customer
Baxter, Robert at 234 5th St, 13126
Cart (VID-23456)
1.0
Customer
Charles, Steven at 345 6th St, 13126
---=== End of Report ===---
Редактировать: я нашел способ, который распечатывает точноеформат, который я хотел, но я все еще не думаю, что это лучший способ, и я хотел бы узнать лучший способ сделать это.
public class MyHandler extends DefaultHandler {
private boolean bCustomer = false;
private double total = 0;
private DecimalFormat df = new DecimalFormat("#.00");
@Override
public void startDocument() throws SAXException {
System.out.println("---=== Report ===---");
}
@Override
public void endDocument() throws SAXException {
printTotal();
System.out.println("---=== End of Report ===---");
}
private void printTotal() {
System.out.println(" Total");
System.out.println(" $" + df.format(total));
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("cart")) {
if (total != 0) {
printTotal();
total = 0;
}
System.out.println("Cart (" + attributes.getValue("id") + ")");
System.out.println(" Customer");
} else if (qName.equalsIgnoreCase("drone")) {
if (total != 0) {
printTotal();
total = 0;
}
System.out.println("Drone (" + attributes.getValue("id") + ")");
System.out.println(" Customer");
} else if (qName.equalsIgnoreCase("scooter")) {
if (total != 0) {
printTotal();
total = 0;
}
System.out.println("Scooter (" + attributes.getValue("id") + ")");
System.out.println(" Customer");
} else if (qName.equalsIgnoreCase("van")) {
if (total != 0) {
printTotal();
total = 0;
}
System.out.println("Van (" + attributes.getValue("id") + ")");
System.out.println(" Customer");
}
if (qName.equalsIgnoreCase("product")) {
boolean bTax = Boolean.parseBoolean(attributes.getValue("taxable"));
double unitPrice = Double.parseDouble(attributes.getValue("unitPrice"));
int quantity = Integer.parseInt(attributes.getValue("quantity"));
if (bTax) {
Taxable taxable = new Taxable(attributes.getValue("productName"), attributes.getValue("isbn"), unitPrice, quantity);
total = total + taxable.getPrice();
} else {
NonTaxable nonTaxable = new NonTaxable(attributes.getValue("productName"), attributes.getValue("isbn"), unitPrice, quantity);
total = total + nonTaxable.getPrice();
}
}
if (qName.equalsIgnoreCase("customer")) {
if (!bCustomer) {
bCustomer = true;
}
System.out.println(" " + attributes.getValue("lastName") + ", " + attributes.getValue("firstName") + " at " + attributes.getValue("streetAddress") + ", " + attributes.getValue("zipCode"));
}
}
}
Этот является ссылкой на мой полныйисходный код, который также содержит объекты, необходимые для XML-файла, который я решил не добавлять, поскольку это сделает мой пост слишком длинным и болезненным для чтения. Я ценю любую помощь!