You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何基于用户输入解析XML以查询指定生产年份的汽车信息

解决方案

方案1:基于现有XPath逻辑修改(改动最小,推荐)

你需要实现的动态传入年份的需求非常容易实现,XPath接收的是字符串参数,直接将Scanner读取的年份做字符串拼接即可,修改后可直接运行的完整代码如下:

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.*;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
        // 读取用户输入的年份区间
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入起始年份:");
        int startYear = scanner.nextInt();
        System.out.print("请输入结束年份:");
        int endYear = scanner.nextInt();
        scanner.close();
        
        // 基础合法性校验
        if (startYear > endYear) {
            System.out.println("错误:起始年份不能大于结束年份");
            return;
        }

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        // 请确保cars.xml放在项目根目录,或者填写文件的绝对路径
        Document doc = db.parse("cars.xml");
        doc.getDocumentElement().normalize();

        XPath xpath = XPathFactory.newInstance().newXPath();
        getNode(doc, xpath, startYear, endYear);
    }

    private static void getNode(Document doc, XPath xpath, int startYear, int endYear) {
        XPathExpression expr;
        Object result = null;
        try {
            // 动态拼接年份到XPath表达式中
            String xpathStr = String.format("/cars/car[production-year[. >= %d and . <= %d]]", startYear, endYear);
            expr = xpath.compile(xpathStr);
            result = expr.evaluate(doc, XPathConstants.NODESET);
        } catch (XPathExpressionException e) {
            e.printStackTrace();
        }

        NodeList nodes = (NodeList) result;
        if (nodes.getLength() == 0) {
            System.out.println("该年份区间没有符合条件的汽车");
            return;
        }
        // 优化输出格式,拆分字段展示
        for (int i = 0; i < nodes.getLength(); i++) {
            Node carNode = nodes.item(i);
            if (carNode.getNodeType() == Node.ELEMENT_NODE) {
                Element carElem = (Element) carNode;
                System.out.println("=== 汽车ID:" + carElem.getAttribute("id") + " ===");
                System.out.println("厂商:" + carElem.getElementsByTagName("manufacturer").item(0).getTextContent());
                System.out.println("型号:" + carElem.getElementsByTagName("model").item(0).getTextContent());
                System.out.println("生产年份:" + carElem.getElementsByTagName("production-year").item(0).getTextContent());
                System.out.println("马力:" + carElem.getElementsByTagName("horsepower").item(0).getTextContent());
                System.out.println("能耗:" + carElem.getElementsByTagName("consumption").item(0).getTextContent());
                System.out.println("价格:" + carElem.getElementsByTagName("price").item(0).getTextContent() + "\n");
            }
        }
    }
}

方案2:不使用XPath,直接遍历DOM节点

如果不想使用XPath,可以直接遍历所有汽车节点做年份判断,逻辑更直观,核心代码如下:

// 替换原main方法中的XPath相关逻辑和getNode方法调用即可
NodeList carList = doc.getElementsByTagName("car");
int count = 0;
for (int i = 0; i < carList.getLength(); i++) {
    Element carElem = (Element) carList.item(i);
    int year = Integer.parseInt(carElem.getElementsByTagName("production-year").item(0).getTextContent());
    if (year >= startYear && year <= endYear) {
        count++;
        // 这里复用上面的字段输出逻辑即可
        System.out.println("=== 汽车ID:" + carElem.getAttribute("id") + " ===");
        System.out.println("厂商:" + carElem.getElementsByTagName("manufacturer").item(0).getTextContent());
        System.out.println("型号:" + carElem.getElementsByTagName("model").item(0).getTextContent());
        System.out.println("生产年份:" + year);
        System.out.println("马力:" + carElem.getElementsByTagName("horsepower").item(0).getTextContent());
        System.out.println("能耗:" + carElem.getElementsByTagName("consumption").item(0).getTextContent());
        System.out.println("价格:" + carElem.getElementsByTagName("price").item(0).getTextContent() + "\n");
    }
}
if (count == 0) {
    System.out.println("该年份区间没有符合条件的汽车");
}

内容的提问来源于stack exchange,提问作者Bleki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:06:03