
XML DTD与Schema解析:参数实体的使用与作用
下载需积分: 19 | 1.12MB |
更新于2024-08-18
| 50 浏览量 | 举报
收藏
"参数实体-DTD 和Schema"
在XML文档中,DTD(Document Type Definition)和Schema都是用于定义和验证XML文档结构的重要工具。DTD是一种较早的定义XML语法规则的方式,而Schema则是W3C推荐的更为现代和强大的替代方案。
### 参数实体在DTD中的应用
参数实体(Parameter Entity)是DTD中的一个特性,它允许我们将常见的元素或属性声明进行抽象和重用。定义参数实体的语法如下:
```xml
<!ENTITY % 实体名 "实体内容">
```
这里的`%实体名;`中的`%`符号表示这是一个参数实体,`实体名`是你自定义的名称,`"实体内容"`可以是文本内容或引用外部文件的URI。例如:
```xml
<!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
```
这个参数实体 `%TAG_NAMES` 定义了一组可选的元素标签。在文档中,你可以通过引用这个参数实体来声明元素,如:
```xml
<!ELEMENT 个人联系信息 (%TAG_NAMES; | 生日)>
<!ELEMENT 客户联系信息 (%TAG_NAMES; | 公司名)>
```
以上示例表示`个人联系信息`和`客户联系信息`元素可以包含`TAG_NAMES`中定义的任意一个元素,以及额外的`生日`或`公司名`元素。
### DTD的基本概念
DTD的主要作用是为XML文档定义一套语法规则,确保文档的有效性。一个有效的XML文档不仅需要遵循XML的语法规则,还要符合DTD中定义的结构和元素关系。DTD包含以下元素:
1. **元素(Element)**:定义文档中可出现的标记,如`<个人联系信息>`。
2. **属性(Attribute)**:元素可以有零个或多个属性,如`<元素名 属性名="属性值">`。
3. **实体(Entity)**:实体用来引用文本或外部资源,分为普通实体和参数实体。
4. **注释(Comment)**:提供对文档的解释。
5. **声明(Declaration)**:如元素声明、属性声明等,指定元素如何使用和其内容模型。
在XML文件中,DTD可以作为内部DTD嵌入到文档的XML声明之后,或者作为外部DTD引用,通过`<!DOCTYPE>`指令指向。
### Schema的介绍
Schema是XML Schema Definition的缩写,它提供了比DTD更强大的功能,如支持数据类型、命名空间、更复杂的约束等。Schema使用XML语法来定义文档结构,使得文档和其定义更加一致。例如,你可以定义元素的类型为整数、日期,甚至自定义的数据类型。
相比于DTD,Schema的优点包括:
1. 支持XML命名空间,使得不同组织或系统可以共用相同的元素和属性名称。
2. 提供了更丰富的数据类型,如整数、浮点数、日期、时间等。
3. 强大的约束能力,如限制元素的数量、顺序、值的范围等。
4. 使用XML格式,易于机器处理和人阅读。
总结来说,DTD和Schema都是XML文档结构的规范,它们为XML提供了一套严谨的语法规则,确保了数据的准确性和一致性。在选择使用哪种时,可以根据项目需求和团队的偏好来决定,一般来说,对于需要更复杂数据验证和类型支持的项目,Schema可能是一个更好的选择。
相关推荐















这是我的表结构:
DROP TABLE IF EXISTS `animalphotos`;
CREATE TABLE `animalphotos` (
`photo_id` int NOT NULL AUTO_INCREMENT COMMENT ' 照片ID',
`animal_id` int NULL DEFAULT NULL COMMENT ' 所属动物ID',
`photo_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '图片路径或URL',
PRIMARY KEY (`photo_id`) USING BTREE,
INDEX `animal_id`(`animal_id` ASC) USING BTREE,
CONSTRAINT `animalphotos_ibfk_1` FOREIGN KEY (`animal_id`) REFERENCES `animals` (`animal_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for animals
-- ----------------------------
DROP TABLE IF EXISTS `animals`;
CREATE TABLE `animals` (
`animal_id` int NOT NULL AUTO_INCREMENT COMMENT '动物唯一标识',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '名称',
`species` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT ' 种类',
`gender` enum('雄','雌') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT ' 性别',
`age` int NULL DEFAULT NULL COMMENT ' 年龄',
`user_id` int NULL DEFAULT NULL COMMENT ' 关联饲养者/管理者(Users.user_id)',
`zone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '动物位置',
PRIMARY KEY (`animal_id`) USING BTREE,
INDEX `caretaker_id`(`user_id` ASC) USING BTREE,
INDEX `species_id`(`species` ASC) USING BTREE,
CONSTRAINT `animals_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for animaltraits
-- ----------------------------
DROP TABLE IF EXISTS `animaltraits`;
CREATE TABLE `animaltraits` (
`trait_id` int NOT NULL AUTO_INCREMENT COMMENT ' 特征ID',
`animal_id` int NULL DEFAULT NULL COMMENT '动物ID(Animals)',
`nature` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '性格 ',
`favourite` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT ' 喜好描述',
PRIMARY KEY (`trait_id`) USING BTREE,
INDEX `animal_id`(`animal_id` ASC) USING BTREE,
CONSTRAINT `animaltraits_ibfk_1` FOREIGN KEY (`animal_id`) REFERENCES `animals` (`animal_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`user_id` int NOT NULL AUTO_INCREMENT COMMENT ' 用户唯一标识',
`username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名',
`password` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码(加密)',
`role` enum('游客','饲养者','管理员') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT ' 角色:游客/饲养者/管理员',
`status` enum('在线','离线') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户状态(是否在线)',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
这是我的实体类:
// User 类
public class User {
private int user_id;
private String username;
private String password;
private String role;
private String status;
private List<Animals> animals; // 用户与动物是一对多关系
// getter 和 setter 方法
}
// Animals 类
public class Animals {
private int animal_id;
private String name;
private String gender; // 雄/雌
private Integer age;
private String species;
private String zone;
private User user; // 动物与用户是一对多关系(反向关联)
private List<AnimalPhoto> animalPhotos; // 动物与照片是一对多关系
// getter 和 setter 方法
}
// AnimalPhoto 类
public class AnimalPhoto {
private int photo_id;
private Animals animal; // 照片与动物是一对多关系(反向关联)
private String photo_url;
// getter 和 setter 方法
}
// AnimalTrait 类
public class AnimalTrait {
private int trait_id;
private Animals animal; // 特征与动物是一对一关系(反向关联)
private String nature; // 性格
private String favourite; // 喜好描述
// getter 和 setter 方法
}
用户 (users) 与动物 (animals) 之间是一对多关系。
动物 (animals) 与照片 (animalphotos) 之间是一对多关系。
动物 (animals) 与特征 (animaltraits) 之间是一对一关系。
这是我登录注册代码:
package com.cxy.Controller;
import com.cxy.Pojo.User;
import com.cxy.Service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.Date;
@Controller
public class UserController {
@Autowired
private UserService userService;
// 显示登录页面
@GetMapping("/login")
public String loginPage(@RequestParam(value = "error", required = false) String error, Model model) {
if (error != null) {
model.addAttribute("error", true);
}
return "/login/login.jsp"; // 返回登录页面
}
// 处理登录请求
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password, HttpSession session, Model model) {
User user = userService.login(username, password);
if (user != null) {
// 更新数据库中的在线状态
userService.updateUserStatus(user.getUserId(), "在线");
// 将用户信息存入 session
session.setAttribute("user", user);
session.setAttribute("username", user.getUsername()); // 存储用户名
session.setAttribute("role", user.getRole()); // 存储角色
session.setAttribute("status", "在线"); // 存储状态
session.setAttribute("loginTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); // 登录时间
return "redirect:/index.jsp"; // 登录成功,跳转到主页
}
// 登录失败,返回登录页面并传递错误信息
model.addAttribute("loginError", "用户名或密码错误,请重新尝试。");
return "login/login.jsp";
}
// 显示注册页面
@GetMapping("/register")
public String registerPage() {
return "/login/register.jsp"; // 返回注册页面
}
// 处理注册请求
@PostMapping("/register")
public String register(User user, Model model) {
if (userService.register(user)) {
return "/login/login.jsp"; // 注册成功,跳转到登录页面
}
model.addAttribute("registerError", "用户名已存在"); // 用户名已存在
return "/login/register.jsp"; // 注册失败,返回注册页面
}
// 处理退出登录
@GetMapping("/logout")
public String logout(HttpSession session) {
User user = (User) session.getAttribute("user");
if (user != null) {
userService.updateUserStatus(user.getUserId(), "离线");
}
session.invalidate(); // 清除session
return "redirect:/login/login.jsp"; // 返回登录页面
}
}
这是我实现登录注册的配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cxy.Mapper.UserMapper">
<select id="findByUsername" resultType="com.cxy.Pojo.User">
SELECT * FROM users WHERE username = #{username}
</select>
<insert id="insertUser" parameterType="com.cxy.Pojo.User">
INSERT INTO users (username, password, role)
VALUES (#{username}, #{password}, #{role})
</insert>
<update id="updateStatus">
UPDATE users SET status = #{status} WHERE user_id = #{user_id}
</update>
</mapper>
application-dao.xml:<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.cxy.Mapper"/>
</bean>
</beans>
application-service.xml:<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.cxy.Service"/>
</beans>
spring-mvc.xml:<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.cxy.Controller"/>
<mvc:annotation-driven/>
<mvc:resources mapping="/css/**" location="/css/" />
</beans>
web.xml:<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>Dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<title>动物园数字档案管理系统</title>
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/index.css">
</head>
<body>
<%
if ("游客".equals(userRole)) {
%>
探索动物世界
<input type="text" placeholder="搜索动物...">
<button onclick="window.location.href='${pageContext.request.contextPath}/activities.jsp'">立即预约活动</button>
<%
} else if ("饲养者".equals(userRole)) {
%>
饲养者面板
欢迎,<%= username %>!您当前状态:<%= userStatus %>
<%
} else if ("管理员".equals(userRole)) {
%>
管理员面板
欢迎,<%= username %>!您当前状态:<%= userStatus %>
<%
} else {
%>
欢迎来到动物园数字档案管理系统
请登录或注册以获取更多功能。
<button onclick="window.location.href='${pageContext.request.contextPath}/login/login.jsp'">登录/注册</button>
<%
}
%>
</body>
</html>
add_animal.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<title>添加动物 - 动物园数字档案管理系统</title>
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/animal_form.css">
</head>
<body>
<jsp:include page="/header.jsp"/>
添加新动物
<form action="${pageContext.request.contextPath}/animal/add" method="post" enctype="multipart/form-data">
<label for="name">动物名称:</label>
<input type="text" id="name" name="name" required>
<label for="species">种类:</label>
<input type="text" id="species" name="species" required>
<label for="gender">性别:</label>
<select id="gender" name="gender" required>
<option value="">请选择</option>
<option value="雄">雄</option>
<option value="雌">雌</option>
</select>
<label for="age">年龄:</label>
<input type="number" id="age" name="age" min="0" required>
<label for="zone">位置:</label>
<input type="text" id="zone" name="zone" required>
<label for="photo_url">上传照片:</label>
<input type="file" id="photo_url" name="photo_url" multiple>
<label for="nature">性格:</label>
<input type="text" id="nature" name="nature" required>
<label for="favourite">喜好描述:</label>
<textarea id="favourite" name="favourite"></textarea>
<button type="submit" class="btn btn-primary">添加动物</button>
取消
</form>
注意:查询查的是动物完整的信息(包括图片),添加也要添加动物完整的信息,可以对数据库插入动物图片。这需要对表进行关联。
请根据我的配置和我给出的添加动物页面add_aniaml.jsp,用javaee的ssm整合框架实现饲养者和管理者对动物的增删改查,,以及写出对应的jsp页面:在/animal/目录内,并修改index页面。包括(controller接口,mapper接口,service,serviceimpl和Mapper新配置)。其中饲养者登录时:显示我的动物导航栏,点击进入页面只能对自己添加的动物进行修改数据和删除,也可以在该页面添加新的动物。而管理者登录时:显示所有动物导航栏,点击进入页面,可以对全部动物信息增删改。饲养者和管理者可以对动物所有信息进行写入。
探索动物世界
<input type="text" placeholder="搜索动物..."> <button onclick="window.location.href='${pageContext.request.contextPath}/activities.jsp'">立即预约活动</button>饲养者面板
欢迎,<%= username %>!您当前状态:<%= userStatus %>
管理员面板
欢迎,<%= username %>!您当前状态:<%= userStatus %>
欢迎来到动物园数字档案管理系统
请登录或注册以获取更多功能。
<button onclick="window.location.href='${pageContext.request.contextPath}/login/login.jsp'">登录/注册</button>添加新动物
<form action="${pageContext.request.contextPath}/animal/add" method="post" enctype="multipart/form-data">
<label for="name">动物名称:</label>
<input type="text" id="name" name="name" required>
<label for="species">种类:</label>
<input type="text" id="species" name="species" required>
<label for="gender">性别:</label>
<select id="gender" name="gender" required>
<option value="">请选择</option>
<option value="雄">雄</option>
<option value="雌">雌</option>
</select>
<label for="age">年龄:</label>
<input type="number" id="age" name="age" min="0" required>
<label for="zone">位置:</label>
<input type="text" id="zone" name="zone" required>
<label for="photo_url">上传照片:</label>
<input type="file" id="photo_url" name="photo_url" multiple>
<label for="nature">性格:</label>
<input type="text" id="nature" name="nature" required>
<label for="favourite">喜好描述:</label>
<textarea id="favourite" name="favourite"></textarea>
<button type="submit" class="btn btn-primary">添加动物</button>
取消
</form>





慕栗子
- 粉丝: 25
最新资源
- 区块链技术封存NFT动画原型的创新应用
- Netlify与Nuxt.js整合:部署Vue项目详解
- jsdoc-githubify-crx插件:美化GitHub Wiki中的JSDOC
- Vizrt扩展插件:社交媒体内容流式传输至Vizrt Social TV
- Polyspector-crx插件:聚合物网组件调试利器
- 在GitHub使用GitX添加保密私人笔记的Chrome扩展
- 全面指南:在PC上安装OPNSense防火墙系统
- 资产商店发布者工具扩展:审阅与通知管理
- Swiss Developer's Toolkit: Huntsman 主要功能介绍
- Starify:为GitHub项目链接一键添加星标徽章
- Concourse CI集成SonarQube资源,自动化获取代码质量报告
- Docker Compose配置模板的介绍与应用
- GitHub项目教程:如何克隆和提交到仓库
- Discord Hypesquad免费获取Nitro代码的在线生成器
- Yac for Gmail: 实现Gmail语音邮件录制与发送
- Zenwego-crx插件:轻松共享旅行计划与朋友
- Docker集成Chrome扩展:快速尝试Docker镜像
- 路由器私有IP地址登录指南与crx插件应用
- ASP.NET Core 3 MVC应用程序开发实践教程
- VPC与计算资源在mtc-dev-repo中的应用
- Bronson Pixel Painter:创意Chrome扩展插件发布
- Chrome屏幕共享神器:趴趴教育crx插件解析
- Wyveria派系前缀与开源聊天系统功能解析
- Lino Tracker:探索区块链资源的CRX插件