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

Я учусь анализировать XML и получил домашнее задание для анализа 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
Cart (VID-23456)
    Customers
        Charles, Steven at 345 6th St, 13126

Как мне разобрать это, чтобы выглядеть так? Я прочитал много уроков, но они используют очень сложный XML или очень простой в качестве примеров, но я думаю, что это как-то связано с созданием списка и созданием объектов для анализа. Я много часов пытался найти решение, но не мог найти правильный способ сделать это. Решение было бы неплохо, но даже подсказка (и ссылка на учебник) также была бы полезна для руководства. Я действительно ценю любую помощь. Также вот что я получил:

public class MyHandler extends DefaultHandler {

    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

        if (qName.equalsIgnoreCase("van")) {
            System.out.println("---=== Report ===---");
            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") + ")");
            System.out.println("---=== End of Report ===---");
        }
    }
}

Результат (который выглядит очень неправильно):

---=== Report ===---
Van (VID-12345)
    Customer
        Adams, Maurice at 123 4th St, 13126
    Customer
        Baxter, Robert at 234 5th St, 13126
Cart (VID-23456)
---=== End of Report ===---
    Customer
        Charles, Steven at 345 6th St, 13126

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Напишите это так:

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 ===---");
    }
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if (qName.equalsIgnoreCase("van")) {
            System.out.println("Van (" + attributes.getValue("id") + ")");
            System.out.println("    Customers");
        }
        if (qName.equalsIgnoreCase("cart")) {
            System.out.println("Cart (" + attributes.getValue("id") + ")");
            System.out.println("    Customers");
        }
        if (qName.equalsIgnoreCase("customer")) {
            System.out.println("        " + attributes.getValue("lastName") + ", " + attributes.getValue("firstName") + " at " + attributes.getValue("streetAddress") + ", " + attributes.getValue("zipCode"));
        }
    }
}

Если вам не нужна строка Customers, если ее нет, то вам нужно отследить, печатали ли вы эту строку уже, например, так:

public class MyHandler extends DefaultHandler {
    private boolean firstCustomer;
    @Override
    public void startDocument() throws SAXException {
        System.out.println("---=== Report ===---");
    }
    @Override
    public void endDocument() throws SAXException {
        System.out.println("---=== End of Report ===---");
    }
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if (qName.equalsIgnoreCase("van")) {
            System.out.println("Van (" + attributes.getValue("id") + ")");
            firstCustomer = true;
        }
        if (qName.equalsIgnoreCase("cart")) {
            System.out.println("Cart (" + attributes.getValue("id") + ")");
            firstCustomer = true;
        }
        if (qName.equalsIgnoreCase("customer")) {
            if (firstCustomer) {
                firstCustomer = false;
                System.out.println("    Customers");
            }
            System.out.println("        " + attributes.getValue("lastName") + ", " + attributes.getValue("firstName") + " at " + attributes.getValue("streetAddress") + ", " + attributes.getValue("zipCode"));
        }
    }
}

Выход (из обеих версий выше)

---=== Report ===---
Van (VID-12345)
    Customers
        Adams, Maurice at 123 4th St, 13126
        Baxter, Robert at 234 5th St, 13126
Cart (VID-23456)
    Customers
        Charles, Steven at 345 6th St, 13126
---=== End of Report ===---
0 голосов
/ 11 октября 2019

Похоже, у вас есть большая часть. Просто удалите несколько строк печати, и это должно выглядеть так, как вы хотите.

public class MyHandler extends DefaultHandler {

    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

        if (qName.equalsIgnoreCase("van")) {
            System.out.println("Van (" + attributes.getValue("id") + ")");
        }
        System.out.println("    Customer");
        if (qName.equalsIgnoreCase("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") + ")");
        }
    }
}

Результат должен выглядеть следующим образом:

Van (VID-12345)
    Customers
        Adams, Maurice at 123 4th St, 13126
        Baxter, Robert at 234 5th St, 13126
Cart (VID-23456)
    Customers
        Charles, Steven at 345 6th St, 13126

Вы добавили дополнительные println, которые добавилидополнительные "------ ====== бла ====== -----". Кроме того, поскольку "println (" customer ") был внутри оператора if, он будет печатать его каждый раз, когда qName равняется customer. Поэтому поместите его снаружи, чтобы он выглядел аналогично продукту, который вы ищете!

...