目录

  1. XML 数据处理的工作原理
  2. 实现 XML 数据处理的方法
  1. 示例代码
  2. 参考资料

XML 数据处理的工作原理

在 JSP 中,XML 数据处理可以通过 JSTL 的 XML 标签库(<x> 前缀)或 Java 的 XML 解析 API(如 DOM、SAX)实现。JSTL 提供简单的方式处理小型 XML 数据,而 DOM 和 SAX 适合更复杂的解析需求。XML 数据通常来自文件、请求参数或外部服务。


实现 XML 数据处理的方法

2.1 使用 JSTL XML 标签

  • 前缀x
  • 常用标签
  • <x:parse>:解析 XML 数据。
  • <x:out>:输出 XML 节点值。
  • <x:forEach>:遍历 XML 节点。
  • 步骤
  1. 引入 JSTL XML 标签库。
  2. 解析 XML 并使用 XPath 表达式访问数据。
  • 示例
  <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  <c:set var="xmlData">
      <users>
          <user><id>1</id><name>Alice</name></user>
          <user><id>2</id><name>Bob</name></user>
      </users>
  </c:set>
  <x:parse var="doc" xml="${xmlData}" />
  <x:forEach select="$doc/users/user">
      ID: <x:out select="id" />, Name: <x:out select="name" /><br>
  </x:forEach>

2.2 使用 Java DOM 解析

  • 作用:将 XML 加载到内存中,构建树结构,适合小型 XML。
  • 步骤
  1. 使用 DocumentBuilder 解析 XML。
  2. 遍历 NodeList 获取数据。
  • 示例
  <%@ page import="javax.xml.parsers.*, org.w3c.dom.*, java.io.StringReader" %>
  <%@ page import="org.xml.sax.InputSource" %>
  <%
      String xml = "<users><user><id>1</id><name>Alice</name></user></users>";
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document doc = builder.parse(new InputSource(new StringReader(xml)));
      NodeList users = doc.getElementsByTagName("user");
      for (int i = 0; i < users.getLength(); i++) {
          Element user = (Element) users.item(i);
          String id = user.getElementsByTagName("id").item(0).getTextContent();
          String name = user.getElementsByTagName("name").item(0).getTextContent();
          out.println("ID: " + id + ", Name: " + name + "<br>");
      }
  %>

2.3 使用 SAX 解析(可选)

  • 作用:事件驱动解析,适合大型 XML 文件,内存占用低。
  • 步骤
  1. 创建 SAXParser
  2. 实现 DefaultHandler 处理事件。
  • 示例(需单独 Java 类,JSP 中调用):
  import org.xml.sax.helpers.DefaultHandler;
  import org.xml.sax.*;
  public class SAXHandler extends DefaultHandler {
      public void startElement(String uri, String localName, String qName, Attributes attributes) {
          System.out.println("开始元素: " + qName);
      }
  }

示例代码

  • JSTL XML 处理(xmlJstl.jsp):
  <%@ page contentType="text/html;charset=UTF-8" %>
  <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  <c:set var="xmlData">
      <users>
          <user><id>1</id><name>Alice</name></user>
          <user><id>2</id><name>Bob</name></user>
      </users>
  </c:set>
  <h3>用户列表 (JSTL XML)</h3>
  <x:parse var="doc" xml="${xmlData}" />
  <table border="1">
      <tr><th>ID</th><th>Name</th></tr>
      <x:forEach select="$doc/users/user">
          <tr>
              <td><x:out select="id" /></td>
              <td><x:out select="name" /></td>
          </tr>
      </x:forEach>
  </table>
  • DOM 解析(xmlDom.jsp):
  <%@ page contentType="text/html;charset=UTF-8" %>
  <%@ page import="javax.xml.parsers.*, org.w3c.dom.*, java.io.StringReader" %>
  <%@ page import="org.xml.sax.InputSource" %>
  <h3>用户列表 (DOM)</h3>
  <%
      String xml = "<users><user><id>1</id><name>Alice</name></user><user><id>2</id><name>Bob</name></user></users>";
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document doc = builder.parse(new InputSource(new StringReader(xml)));
      NodeList users = doc.getElementsByTagName("user");
  %>
  <table border="1">
      <tr><th>ID</th><th>Name</th></tr>
      <%
          for (int i = 0; i < users.getLength(); i++) {
              Element user = (Element) users.item(i);
              String id = user.getElementsByTagName("id").item(0).getTextContent();
              String name = user.getElementsByTagName("name").item(0).getTextContent();
      %>
          <tr><td><%=id%></td><td><%=name%></td></tr>
      <%
          }
      %>
  </table>

参考资料

  1. Oracle 官方文档
  1. JavaTpoint JSP 教程
  1. Oracle XML 解析

注意事项

  • JSTL XML:适合简单 XML 处理,依赖 JSTL 库。
  • DOM:内存占用较高,不适合超大 XML 文件。
  • SAX:适合流式处理大型 XML。

如果需要从文件读取 XML 或更复杂的解析,请告诉我!