我是一名新手,正在学习如何进行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文件所需的对象,因为这会使我的帖子过长且难以阅读。感谢您的帮助!
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>";
}