gpt4 book ai didi

java - 需要帮助如何正确解析

转载 作者:行者123 更新时间:2023-12-01 23:16:32 24 4
gpt4 key购买 nike

我是一名学习如何进行 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

如何解析它以使其看起来像建议的格式?我读过很多教程和示例,但找不到可以帮助我的。根据我所读到的内容,我的最佳猜测是它与制作列表或创建要解析的对象有关。我也无法弄清楚如何计算“总计”(即每个“包裹”中所有商品的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"));
}
}
}

This 是我的完整源代码的链接,其中还包含 XML 文件所需的对象,我决定不添加这些对象,因为这会使我的帖子太长且难以阅读。我感谢任何帮助!

最佳答案

    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>";
}

关于java - 需要帮助如何正确解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58350670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com