Нужна помощь как правильно разобрать - PullRequest
0 голосов
/ 12 октября 2019

Я новичок, изучающий, как выполнять синтаксический анализ 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-файла, который я решил не добавлять, поскольку это сделает мой пост слишком длинным и болезненным для чтения. Я ценю любую помощь!

1 Ответ

0 голосов
/ 12 октября 2019
    import org.dom4j.DocumentException;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;

    import java.util.List;

/**
 * @Author: panlf
 * @Date: 2019/9/16 9:27
 */
public class Dom4jTeset {
    public static void main(String[] args) throws DocumentException {
        Element root = DocumentHelper.parseText(XML).getRootElement();
        List<Element> all = root.elements();
        for (Element child : all) {
            System.out.println(child.getQName().getName()+" ("+ child.attribute("id").getValue()+")");
            System.out.println("    Customer");
            double sum=0;
            for (Element pack : child.elements()) {
                Element customer = pack.elements("customer").get(0);
                for (Element prod : pack.elements()) {
                    if(prod.getQName().getName().equals("customer"))continue;
                    String unitPrice = prod.attribute("unitPrice").getValue();
                    sum+=Double.parseDouble(prod.attribute("unitPrice").getValue())* Integer.parseInt(prod.attribute("quantity").getValue());
                }
                System.out.println("        "+ customer.attribute("lastName").getValue()+", "+ customer.attribute("firstName").getValue()+ " at " + customer.attribute("streetAddress").getValue()+" "+ customer.attribute("zipCode").getValue());
            }
            System.out.println("    Total");
            System.out.println("        $"+sum);
        }
    }




    private static String XML="<?xml version=\"1.0\" ?>\n" +
            "<deliveries>\n" +
            "    <van id=\"VID-12345\">\n" +
            "        <package>\n" +
            "            <product taxable=\"true\" productName=\"Headphones\" isbn=\"123456\" unitPrice=\"10.00\" quantity=\"1\"/>\n" +
            "            <product taxable=\"false\" productName=\"Milk\" isbn=\"234567\" unitPrice=\"2.00\" quantity=\"2\"/>\n" +
            "            <customer lastName=\"Adams\" firstName=\"Maurice\" streetAddress=\"123 4th St\" zipCode=\"13126\" accountNumber=\"ACCT-54321\"/>\n" +
            "        </package>\n" +
            "        <package>\n" +
            "            <product taxable=\"true\" productName=\"Snickers\" isbn=\"345678\" unitPrice=\"1.00\" quantity=\"1\"/>\n" +
            "            <product taxable=\"false\" productName=\"Milk\" isbn=\"234567\" unitPrice=\"2.00\" quantity=\"1\"/>\n" +
            "            <customer lastName=\"Baxter\" firstName=\"Robert\" streetAddress=\"234 5th St\" zipCode=\"13126\" accountNumber=\"ACCT-65432\"/>\n" +
            "        </package>\n" +
            "    </van>\n" +
            "    <cart id=\"VID-23456\">\n" +
            "        <package>\n" +
            "            <product taxable=\"true\" productName=\"Snickers\" isbn=\"345678\" unitPrice=\"1.00\" quantity=\"1\"/>\n" +
            "            <customer lastName=\"Charles\" firstName=\"Steven\" streetAddress=\"345 6th St\" zipCode=\"13126\" accountNumber=\"ACCT-76543\"/>\n" +
            "        </package>\n" +
            "    </cart>\n" +
            "</deliveries>";
}
...