• XML配置文件解析与建模


    目录

    什么是xml?

    xml的作用:

    一,XML元素的定义语法

    二,XML属性的定义语法

    建模并解析到内存条


    今天小编给大分享一下xml配置文件的解析与读取,希望能对各位大佬们有所帮助。

    什么是xml?

    是标记语言,按照规定好的语法去编写xml文件,可以被解析成功。

    xml的作用:

    1,数据交互(可跨语言进行数据传递)

    2,做配置

    学习xml目的:自定义MVC需要手动配置xml。

    标准的xml格式是怎么样的呢?

    1,只有一个根元素(首位呼应)

    2,,xml标签大小写正确区分

    3,正确使用嵌套(不能错乱)

    4,使用合法的标签名(不能使用关键字)与属性(它有规定好的属性,不能DIY)

    需要定义的代码

    1. <persons>
    2. <person pid="p1" sex="男" qq="aaa" parent="p2">
    3. <name>张小明</name>
    4. <age>10</age>
    5. <contact>
    6. <phone>1234567</phone>
    7. </contact>
    8. <br/>
    9. </person>
    10. <person pid="p2">
    11. <name>张大明</name>
    12. <age>35</age>
    13. <contact>
    14. <email>123@qq.com</email>
    15. </contact>
    16. </person>
    17. </persons>

    一,XML元素的定义语法

    xml加入前最上面先声明:

    <!DOCTYPE rott[]>

    1,元素的分类语法

    1. //rott 代表根元素
    2. <!ELEMENT element-name Empty> 空元素
    3. <!ELEMENT element-name(#PCDATA)> 文本元素
    4. <!ELEMENT element-name(e1,e2,e3..)> 混合元素

    2,次数语法

    0或1:?

    0~N:*

    1~N:+

    1. <!DOCTYPE persons[
    2. <!ELEMENT persons (person+)>
    3. <!ELEMENT person (name,age,contact,br*)>
    4. <!ELEMENT name (#PCDATA)>
    5. <!ELEMENT age (#PCDATA)>
    6. <!ELEMENT contact (phone|email)>
    7. <!ELEMENT br EMPTY>
    8. ]>

    二,XML属性的定义语法

    xml加入前最上面先声明:

    <!ATTLIST element-name att_name type desc>

    1,属性类型语法

    ID(编号)、CDATA(文本内容)、IDREF(父标签)、reference,(男|女)

    #REQUIRED:必填 #IMPLIED:选填

    ‘默认值’:只有type为(男,女)类型时,dese才可使用默认值方式

    1. <!ATTLIST person
    2. pid ID #REQUIRED
    3. sex (男|女) '女'
    4. qq CDATA #IMPLIED
    5. parent IDREF #IMPLIED
    6. >

    注意事项:属性定义代码必须在元素定义代码里面,也就是说,元素定义代码必须包含元素定义代码。

    读取xml案例

    需要使用jar包详解

    beanutils 处理java反射机制的包

    logging 处理日志文件的包

    dom4j 解析xml文件的包

    neat 解析xml文件的包

    jstl jsp标签库

    conector 加载mysql驱动程序的包

    standard servert处理请求的包

    需要解析读取的students.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <students>
    3. <student sid="s001">
    4. <name>小明</name>
    5. </student>
    6. <student sid="s002">
    7. <name>小芳</name>
    8. </student>
    9. <student sid='s003'>
    10. <name>小王</name>
    11. </student>
    12. </students>

    结果如下

    解析代码如下

    1. public static void main(String[] args) throws Exception {
    2. InputStream in = Wordxml2Read.class.getResourceAsStream("/students.xml");//通过Java反射机制获取IO流
    3. SAXReader reader = new SAXReader();//实例化xml解析器
    4. Document doc = reader.read(in);//读取流对象,并用Document封装
    5. Element root = doc.getRootElement();//获取Element根节点
    6. List<Element> students = root.selectNodes("/students/student");//获取根节点下的多个子节点全部属性
    7. for (Element student : students) {//遍历全部子节点
    8. String sid = student.attributeValue("sid");//通过attributeValue()得到子节点属性
    9. System.out.println("sid="+sid);
    10. List<Element> name = student.selectNodes("name");
    11. for (Element names : name) {
    12. System.out.println(names.getText());
    13. }
    14. }
    15. //String name = student.selectSingleNode("name").getText();//获取单个节点
    16. }
    17. }

    建模并解析到内存条

    需要建模的config.xml配置核心文件

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE config[
    3. <!ELEMENT config (action*)>
    4. <!ELEMENT action (forward*)>
    5. <!ELEMENT forward EMPTY>
    6. <!ATTLIST action
    7. path CDATA #REQUIRED
    8. type CDATA #REQUIRED
    9. >
    10. <!ATTLIST forward
    11. name CDATA #REQUIRED
    12. path CDATA #REQUIRED
    13. redirect (true|false) "false"
    14. >
    15. ]>
    16. <config>
    17. <action path="/studentAction" type="org.lisen.mvc.action.StudentAction">
    18. <forward name="students" path="/students/studentList.jsp" redirect="false"/>
    19. </action>
    20. <action path="/studentAction01" type="org.lisen.mvc.action.StudentAction">
    21. <forward name="students01" path="/students/studentList.jsp" redirect="true"/>
    22. </action>
    23. </config>

    结果如下

    configModel类

    1. package mvc;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. import Exception.ActionDuliplateDefinitionException;
    5. import Exception.ActionNoFindException;
    6. public class ConfigModel {
    7. Map<String,ActionModel> actionMap=new HashMap<String, ActionModel>();
    8. //获取action的path,然后保存到集合中
    9. public void addConfig(ActionModel action) {
    10. if(actionMap.containsKey(action.getPath())) {//如果action的path值已存在,就报异常,因为action的键是唯一的
    11. throw new ActionDuliplateDefinitionException("action path:" + action.getPath()+ " 不能重复");
    12. }
    13. actionMap.put(action.getPath(), action);
    14. }
    15. //获取xml里action的path值
    16. public ActionModel find(String path) {
    17. if(!actionMap.containsKey(path)) {//xml中如果action里面不包含path报异常
    18. throw new ActionNoFindException("action path:"+path+"没有找到");
    19. }
    20. return actionMap.get(path);
    21. }
    22. }

    ActionModel类

    1. package mvc;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. import Exception.ForwardDuliplateDefinitionException;
    5. import Exception.ForwardNotFoundException;
    6. public class ActionModel {
    7. String path;
    8. String type;
    9. Map<String, ForwardMeodel> forwardMap=new HashMap<String, ForwardMeodel>();
    10. public String getPath() {
    11. return path;
    12. }
    13. public void setPath(String path) {
    14. this.path = path;
    15. }
    16. public String getType() {
    17. return type;
    18. }
    19. public void setType(String type) {
    20. this.type = type;
    21. }
    22. @Override
    23. public String toString() {
    24. return "ActionModel [path=" + path + ", type=" + type + "]";
    25. }
    26. //获取forward的path,然后保存到集合中
    27. public void addAction(ForwardMeodel forward) {
    28. System.out.println(forward);
    29. if(forwardMap.containsKey(forward.getName())) {//如果forwardMap的name值已存在,就报异常,因为forward的键是唯一的
    30. throw new ForwardDuliplateDefinitionException("forward name:"+forward.getName()+"不能重复");
    31. }
    32. forwardMap.put(forward.getName(), forward);
    33. }
    34. //获取xml里forward的name值
    35. public ForwardMeodel find(String name) {
    36. if(!forwardMap.containsKey(name)) {//xml中如果forward里面不包含name报异常
    37. throw new ForwardNotFoundException("forward name:"+name+"不存在");
    38. }
    39. return forwardMap.get(name);
    40. }
    41. }

    ForwardMeodel类

    1. package mvc;
    2. public class ForwardMeodel {
    3. String name;
    4. String path;
    5. boolean redirect;
    6. public String getName() {
    7. return name;
    8. }
    9. public void setName(String name) {
    10. this.name = name;
    11. }
    12. public String getPath() {
    13. return path;
    14. }
    15. public void setPath(String path) {
    16. this.path = path;
    17. }
    18. public boolean isRedirect() {
    19. return redirect;
    20. }
    21. public void setRedirect(boolean redirect) {
    22. this.redirect = redirect;
    23. }
    24. public void setRedirect(String redirect) {
    25. if("true".equals(redirect) || "false".equals(redirect)) {
    26. this.redirect= Boolean.valueOf(redirect);
    27. }else {
    28. throw new RuntimeException("属性redirect的值必须位ture或者false");
    29. }
    30. }
    31. @Override
    32. public String toString() {
    33. return "ForwardMeodel [name=" + name + ", path=" + path + ", redirect=" + redirect + "]";
    34. }
    35. }

    解析并生成ConfigModelFactory模型

    1. package mvc;
    2. import java.io.InputStream;
    3. import java.util.List;
    4. import org.dom4j.Document;
    5. import org.dom4j.Element;
    6. import org.dom4j.io.SAXReader;
    7. public final class ConfigModelFactory {
    8. private ConfigModelFactory() {}//单例模式(中的饥饿模式,只有一个实例,不能被实例化)
    9. private static ConfigModel config=new ConfigModel();
    10. //静态代码块,在类加载的时候只执行一次,在这里完成config.xml文件的解析和Config相关的
    11. //模型的建立,这样在整个系统运行阶段只会解析一次
    12. static{
    13. try {
    14. InputStream is = ConfigModelFactory.class.getResourceAsStream("/config.xml");//获取IO流对象
    15. SAXReader reader=new SAXReader();//实例化xml解析器
    16. Document doc = reader.read(is);//读取并放入Document文档
    17. Element root=doc.getRootElement();//获取Element根节点
    18. List<Element> Nodes = root.selectNodes("/config/action");//获取全部元素(根元素下)
    19. for (Element action : Nodes) {//遍历子元素
    20. String path = action.attributeValue("path");
    21. String type=action.attributeValue("type");//通过attributeValue()方法得到属性文本
    22. ActionModel actionModel=new ActionModel();
    23. actionModel.setPath(path);//将属性设置到ActionModel中
    24. actionModel.setType(type);
    25. List<Element> forwards = action.selectNodes("forward");//获取全部元素(根元素下)
    26. for (Element f : forwards) {//遍历子元素
    27. String name = f.attributeValue("name");//通过attributeValue()方法得到属性文本
    28. String fpath = f.attributeValue("path");
    29. String redirect = f.attributeValue("redirect");
    30. ForwardMeodel forwardMeodel=new ForwardMeodel();
    31. forwardMeodel.setName(name);//将属性设置到ForwardMeodel中
    32. forwardMeodel.setPath(fpath);
    33. forwardMeodel.setRedirect(redirect);
    34. actionModel.addAction(forwardMeodel);//将forwardMeodel添加到actionModel
    35. }
    36. config.addConfig(actionModel);//将actionModel添加到configMepdel
    37. }
    38. }catch(Exception e){
    39. throw new RuntimeException(e);//接收到的异常信息向上刨
    40. }
    41. }
    42. //获取系统的Config配置对象
    43. public static ConfigModel getConfig() {
    44. return config;
    45. }
    46. //测试代码
    47. public static void main(String[] args) {
    48. ConfigModel configModel = getConfig();
    49. ActionModel action = configModel.find("/studentAction");
    50. System.out.println(action);
    51. ForwardMeodel forward = action.find("students");
    52. System.out.println(forward);
    53. }
    54. }

  • 相关阅读:
    永磁同步电机36问(三)——SVPWM代码实现
    如何将html转化为pdf
    HT32基本外设使用
    (十四)Spring之回顾代理模式
    GitHub上标星23K+的Redis进阶笔记(应用+原理+集群+拓展+源码)
    基于Java毕业设计学校图书资源交易平台源码+系统+mysql+lw文档+部署软件
    第1章Linux基础篇-Linux入门
    机器学习基础-数据分析:房价预测
    如何在华为 Ascend 设备上运行模型
    java【毕业设计】项目-第111期基于ssm的教务信息管理系统-计算机毕业设计
  • 原文地址:https://blog.csdn.net/Bugxiu_fu/article/details/125573155