首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 程式設計師必備:XML 面試十大高頻題深度解析(含程式碼範例)

     編輯:Java 相關知識

從基礎概念到實戰避坑:XML 技術棧在 Java 生態的完整映射

XML 在 Java 體系中無處不在:web.xml、pom.xml、Spring 配置、MyBatis Mapper、JAXB 綁定、SOAP 訊息、JMS 郵件格式。掌握核心概念不僅為面試,更為日常除錯、架構選型。本文在上一篇基礎上,補充 Java 視角的程式碼範例、常見庫、效能陷阱。

Java 視角的 10 題強化版

  1. XML 基礎:理解 <?xml version="1.0" encoding="UTF-8"?> 宣告、編碼聲明的重要性(解析器按此解碼)。
  2. 驗證實戰:
    // Schema 驗證
    SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = sf.newSchema(new File("order.xsd"));
    Validator v = schema.newValidator();
    v.validate(new StreamSource(new File("order.xml"))); // 拋 SAXException 即不合法
    
  3. XPath 查詢:
    XPathFactory xpf = XPathFactory.newInstance();
    XPath xpath = xpf.newXPath();
    String expr = "//order[@status='SHIPPED']/item/sku/text()";
    NodeList nl = (NodeList) xpath.evaluate(expr, doc, XPathConstants.NODESET);
    
  4. XSLT 轉換:
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer t = tf.newTransformer(new StreamSource("order2html.xsl"));
    t.transform(new StreamSource("order.xml"), new StreamResult(new File("order.html")));
    
  5. 元素/屬性操作 (DOM):doc.createElementNS(ns, "tag")、elem.setAttribute("id", "1")、elem.getTextContent()。
  6. Well-formed 檢查:DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(inputStream) 拋 SAXParseException 即不合法。
  7. 命名空間處理:xpath.setNamespaceContext(ctx)、DocumentBuilderFactory.setNamespaceAware(true)(預設 false,易導致 XPath 查無結果)。
  8. 解析器選型:
    • 小文件、需隨機修改 → DOM(DocumentBuilder)。
    • 大文件、單向讀取 → SAX(DefaultHandler)或 StAX(XMLStreamReader)。
    • 高效能、需索引 → VTD-XML。
  9. CDATA 生成/解析:
    // 生成
    CDATASection cdata = doc.createCDATASection("<script>alert(1)</script>");
    elem.appendChild(cdata);
    // 解析:SAX handler 的 characters() 會收到原始文本,無需手動轉義
    
  10. JAXB 綁定:
    @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD)
    public class Order { @XmlAttribute Long id; @XmlElement List<Item> items; }
    
    // 封送/解封送
    JAXBContext ctx = JAXBContext.newInstance(Order.class);
    Marshaller m = ctx.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    m.marshal(order, System.out);
    Unmarshaller u = ctx.createUnmarshaller(); Order o = (Order) u.unmarshal(new File("order.xml"));
    

Java XML 生態常用庫速查

場景推薦庫特點
標準綁定JAXB (JDK 6-10 內建, 11+ 需額外引入)註解驅動、標準 API
高效能解析Woodstox (StAX 實作)快速、低記憶體、支援非標準 XML
大文件隨機訪問VTD-XML索引式、XPath 極快、記憶體映射
簡單配置讀取Dom4j / JDOM2API 友善、XPath 整合好
JSON⇄XML 轉換Jackson XmlMapper / org.json雙向、流式

避坑指南

  • XXE 攻擊:解析外部實體可導致檔案讀取/SSRF。必須關閉:dbf.setFeature("https://apache.org/xml/features/disallow-doctype-decl", true)、setFeature("https://xml.org/sax/features/external-general-entities", false)、setFeature("https://xml.org/sax/features/external-parameter-entities", false)。
  • Billion Laughs:遞歸實體擴展導致 OOM。同樣關閉外部實體、限制實體擴展大小。
  • 命名空間感知:DocumentBuilderFactory.setNamespaceAware(true) 預設關閉,導致 XPath 查詢失效,務必開啟。
  • 編碼不一致:XML 宣告 encoding、HTTP Header、檔案實際編碼三者不一致會亂碼。統一 UTF-8,解析時指定 InputSource.setEncoding("UTF-8")。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved