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
相关产品推荐
相关产品推荐

