需要帮助如何正确解析

问题描述 投票:0回答:1

我是一名新手,正在学习如何进行XML解析,并收到了使用Java解析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
    Total
        $17.00
Cart (VID-23456)
    Customers
        Charles, Steven at 345 6th St, 13126
    Total
        $1.00

我如何将其解析为建议的格式?我已经阅读了许多教程和示例,但是找不到可以帮助我的教程和示例。从我所读的书中,我最大的猜测是它与创建列表或创建要解析的对象有关。我也无法弄清楚如何计算“总计”(即单价*每个“包装”中所有商品的数量之和)。一个解决方案会很好,但是详细的提示(或相关的教程链接)也将有助于指导我。我将不胜感激任何帮助。这是我目前正在处理的代码:

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 ===---

编辑:This是我完整源代码的链接,该源代码也包含我决定不添加的XML文件所需的对象,因为这会使我的帖子过长且难以阅读。感谢您的帮助!

java xml xml-parsing
1个回答
0
投票
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>"; }
© www.soinside.com 2019 - 2024. All rights reserved.