XML之建模
前言
在之前的博客中与大家分享了关于XML的DTD和解析的相关知识,今天与大家分享的是XML的建模知识。我们还是根据我们的思维导图看看今天要分享的知识。
思维导图:
1. 了解XML建模
1.1 概念
XML建模是一种利用XML语言来描述和定义数据结构和数据关系的方法。
1.2 核心思想
XML建模的核心思想是基于XML语言创建数据模型,从而描述数据的结构和关系;另一个核心思想是将数据和结构分离。具体来说就是利用java面向对象的特性,用操作对象的方式操作xml。
1.3 重要性
- 灵活性:XML建模是一种灵活可扩展的方式,并且支持自定义标记和属性。这意味着XML建模可以适应不同类型的数据需求,数据如何组织和存储可以更容易地进行定制和修改。
- 分离数据和结构:XML建模将数据与其结构分离。这意味着数据存储在XML文件中,而结构在定义标记和属性时序列化。 这种分离使数据模型的使用更加灵活和可重用。此外,通过这种分离,用户可以更安全地修改数据和结构,并且可以使用多个数据模型来共同使用数据存储库。
- 可移植性:XML建模已成为跨平台环境下的事实标准。由于XML建模的特性,使得其应用程序不依赖于任何特定的应用程序或数据库管理系统,从而实现在各种平台和不同应用程序之间高效地交换和共享数据。
- 支持自动化和标准化:XML建模可以自动化数据处理,并支持标准的数据格式。这意味着用户可以创建可读取的数据,并通过不同的系统进行处理,例如数据验证、数据转换、数据序列化和其他自动化过程。
1.4 优势
- XML建模在现代IT系统设计中具有极大的重要性,可以帮助在各种应用程序、平台和设备之间实现数据的高效共享和处理。
- 提高代码的复用性
- XML语言具有灵活、可扩展、标准化和跨平台等特性,这使得它成为现代信息交换和处理的重要工具,被广泛应用于各种大小和类型的IT系统和应用程序中。
2. XML建模
2.1 建模逻辑思维
- 抽象数据模型:XML建模的第一个步骤是想象你需要处理的数据的抽象模型。这可以是一些数据库查询,或者一个复杂的应用程序,或者一个需要传输或存储的数据集。最终目标是在想象中建立一种数据模型,这将是一个不变的结构,它可以随着时间的推移而改变,但在当前的上下文中,它是完美的描述。
- 定义结构:接下来,你需要定义数据结构。这包括确认需要什么类型的数据以及数据之间的关系。选择正确的标记和属性对于定义正确的结构至关重要。在确定标签和属性后,数据将被编写为符合指定结构的XML文档。这通常是一种逐步迭代的过程,其中需要尝试多种不同的结构方案来确定最终的结构。
- 优化性能:XML文档的大小对性能可能会产生影响。这时需要对XML文档进行压缩、转义、优化等操作,以提高性能和减小文档大小。这种优化过程对处理和传输大量XML数据的应用程序尤其重要。
- 标准化和数据交换:XML文档通常需要在不同的应用程序之间传输和共享。此时需要将XML文档标准化为一般接受的数据格式、定义基于XML的数据交换协议、设计数据传输API,以实现不同应用程序间的数据交换。
2.2 建模逻辑顺序
- 定义数据模型:确定需要建模的数据类型以及数据之间的关系和层次结构。这是XML建模的核心思想,必须首先确定好。
- 设计XML文档结构:设计XML文档标签和属性,从而描述和表示数据模型。这一步骤需要按照“从上到下,从大到小”的方式逐步细化,以确保XML文档正确、合理地描述了数据模型。
- 创建XML文档:将数据填充到XML文档中,包括使用标签和属性描述数据、定义CDATA节、注释和处理指令、编写DTD和Schema文档等等。
- 优化XML文档:通过优化及其他技术手段,将XML文档体积降低、运行速度提升,如使用压缩技术、删除注释、删除无用空格等。
- 标准化和交换:确保XML文档与特定的应用程序和计算机系统兼容并正确交换。这需要定义数据交换协议,并确保XML文档符合标准格式、编码方式和命名规则。
- 验证和测试:最后需要确保创建的XML文档符合设计标准和要求,以及能够正确实现数据模型的各种功能和要求。
2.3 建模模式
工厂模式
2.4 XML建模的综合运用(案例)
2.4.1 新建一个config.xml文件。
<?xml version="1.0" encoding="UTF-8"?> <config> <action path="/regAction" type="test.RegAction"> <forward name="failed" path="/reg.jsp" redirect="false" /> <forward name="success" path="/login.jsp" redirect="true" /> </action> <action path="/loginAction" type="test.LoginAction"> <forward name="failed" path="/login.jsp" redirect="false" /> <forward name="success" path="/main.jsp" redirect="true" /> </action> <action path="/addBook" type="test.BookAction"> <forward name="add" path="/login.jsp" redirect="false" /> <forward name="del" path="/del.jsp" redirect="true" /> <forward name="update" path="/update.jsp" redirect="true" /> </action> </config>
2.4.2 创建四大类
ForwardModel模型对象类
package com.YX_ModelText; public class ForwardModel { private String name; private String path; private boolean redirect; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public boolean isRedirect() { return redirect; } public void setRedirect(boolean redirect) { this.redirect = redirect; } }
ActionMode模型对象类
package com.YX_ModelText; import java.util.HashMap; import java.util.Map; public class ActionModel { private String path; private String type; private Map<String, ForwardModel> fmap=new HashMap<String, ForwardModel>(); public String getPath() { return path; } public void setPath(String path) { this.path = path; } public String getType() { return type; } public void setType(String type) { this.type = type; } // 将forword往action中方 压栈 public void push(ForwardModel forwordModel) { fmap.put(forwordModel.getName(), forwordModel); } // 从action通过name值取出 public ForwardModel pop(String name) { return fmap.get(name); } }
ConfigModel模型对象类
package com.YX_ModelText; import java.util.HashMap; import java.util.Map; public class ConfigModel { private Map<String, ActionModel> amap=new HashMap<String, ActionModel>(); public void push(ActionModel actionmodel) { amap.put(actionmodel.getPath(), actionmodel); } public ActionModel pop(String path) { return amap.get(path); } public static void main(String[] args) throws Exception { ConfigModel configmodel= ConfigModelFactory.build(); ActionModel actionmodel=configmodel.pop("/loginAction"); ForwardModel forward=actionmodel.pop("success"); System.out.println(forward.getPath()); } }
ConfigModelFactory模型对象类
package com.YX_ModelText; import java.io.InputStream; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class ConfigModelFactory { public static ConfigModel build() throws Exception { // 实例化模型对象 ConfigModel configmodel=new ConfigModel(); InputStream is = ConfigModelFactory.class.getResourceAsStream("/config.xml"); // 实例化工具类 SAXReader sr=new SAXReader(); // 读取流 Document doc = sr.read(is); // 集合存储action标签 List<Element> actionEle = doc.selectNodes("/config/action"); // 遍历 for (Element aelement : actionEle) { // System.out.println(aelement.asXML()); // 实例化ActionModel模型对象 ActionModel actiomodel=new ActionModel(); // 给actio你标签中的属性值 actiomodel.setPath(aelement.attributeValue("path")); actiomodel.setType(aelement.attributeValue("type")); //获取forword标签集合 List<Element> forEle = aelement.selectNodes("forward"); // 遍历 for (Element fEle : forEle) { // System.out.println(fEle.asXML()); ForwardModel forwordmodel=new ForwardModel(); // 设置属性值 forwordmodel.setName(fEle.attributeValue("name")); forwordmodel.setPath(fEle.attributeValue("path")); // 只有填写false才是转发,其他都是重定向 forwordmodel.setRedirect(!"false".equals(fEle.attributeValue("redirect"))); // 将ForwordModel添加到ActionModel actiomodel.push(forwordmodel); } // 将ActionModel加入ConfigModel中 configmodel.push(actiomodel); } return configmodel; } public static void main(String[] args) throws Exception { ConfigModelFactory.build(); } }
测试;在ConfigModel输入以下代码
public static void main(String[] args) throws Exception { ConfigModel configmodel= ConfigModelFactory.build(); ActionModel actionmodel=configmodel.pop("/loginAction"); ForwardModel forward=actionmodel.pop("success"); System.out.println(forward.getPath()); }
输出结果: