为了账号安全,请及时绑定邮箱和手机立即绑定

我需要有关如何正确解析的帮助

我需要有关如何正确解析的帮助

沧海一幻觉 2023-10-19 14:52:28
我正在学习如何进行 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, 13126Cart (VID-23456)    Customers        Charles, Steven at 345 6th St, 13126我如何解析它看起来像这样?我读过很多教程,但它们要么使用非常复杂的 XML,要么使用非常简单的 XML 作为示例,但我认为这与创建列表和创建要解析的对象有关。我已经尝试了很多小时来寻找解决方案,但无法找到正确的方法。一个解决方案会很好,但即使是一个提示(和教程链接)也有助于指导我。我真的很感谢任何帮助。这也是我到目前为止所得到的:
查看完整描述

2 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

像这样写:


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


查看完整回答
反对 回复 2023-10-19
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

看起来你已经掌握了大部分内容。只需删除一些打印线,它应该看起来像你想要的样子。


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 ,其中添加了额外的 "------====== blah ======-----" 。另外,由于 "println("customer") 位于 if 语句内部,因此每次 qName 等于 customer 时它都会打印它。因此将其放在外面,这样它看起来与您正在寻找的产品相似!


查看完整回答
反对 回复 2023-10-19
  • 2 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信