xml相关知识,xml与properties的选择问题

本文深入讲解了XML的基础语法、特点及两种主要解析方式DOM与SAX,并通过实例演示了如何利用DOM4J库进行XML文件的解析。同时,探讨了XML在工厂模式中的配置应用,对比了XML与Properties文件的不同之处。
Html   显示页面
Xml 存储数据和传输数据 本身是为了取代html  现在实际作用是存储数据和作为配置文件  传输数据功能被json实现了   xml是可拓展的标记语言(xml中允许用户自定义标签)
Xml第一行是配置文件 版本号,字符集等数据<?xml version="1.0" encoding="UTF-8"?>而且自动顶头写
语法:
标签区分大小写 <A> <a>

Xml语法很严格,有开始标签就要有结束标签 </book>

xml的元素名称,必须以字母开头,中间不能有空格和:

元素的名称不能是以xml开头,这儿不区分大小写

xml文档必须有一个根元素

!标签可嵌套,但是不允许交叉嵌套

属性:

不能使用空格,冒号特殊字符

属性必须以字母开头

属性必须使用引号

注释:

<!--注释-->



xml解析方式:

Dom解析和SAX解析

Dom解析:整个文档加载到内存中,进行解析

优点:支持增删改查

缺点:文档特别大,有可能造成内存溢出

SAX解析:一行接着一行解析 不会造成内存溢出,适用于大文件的解析

缺点:不能进行增删改



dom解析需要导入包 dom4j-1.6.1jar包

先写一个简单的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<books>
	<book>
		<auther id="886">Yoo Fale</auther>
		<name>不能遗忘的那些日子</name>
		<price>999</price>
	</book>
	<book>
		<auther>夏红</auther>
		<name>gay里gay气</name>
		<price>12</price>
	</book>
</books>
写解析文件
public class Demo1 {

	public static void main(String[] args) throws DocumentException {
		// 获取文档解析器
		SAXReader reader = new SAXReader();
		// 加载文件demo1.xml 返回document 代表整个文档
		Document document = reader.read("src/demo1.xml");
		// 获取文件根节点(根元素)
		Element rootElement = document.getRootElement();// <books></books>
		Element element2 = rootElement.element("book");
		Element element3 = element2.element("auther");
		String text = element3.getText();
		System.out.println(text);
		// 获取子节点
		Object object = rootElement.elements("book").get(0);// <book>(/book>
		// 强转为元素
		Element book1 = (Element) object;
		// 再次获取子节点
		Element element = book1.element("auther");// <auther></auther>
		// 获取文本内容
		String auther = element.getText();
		System.out.println(auther);
	}

}
获取属性的值
// 获取id属性的
		Element element = book1.element("auther");// <auther></auther>
		// 获取id属性的值
		Attribute attr = element.attribute("id");
		System.out.println(attr.getValue());

遍历获取相同标签内容
public static void main(String[] args) throws DocumentException {
		// 获取文档解析器
		SAXReader reader = new SAXReader();
		// 加载文件demo1.xml 返回document 代表整个文档
		Document document = reader.read("src/demo1.xml");
		// 获取文件根节点(根元素)
		Element rootElement = document.getRootElement();// <books></books>
		// 获取子节点
		List elements = rootElement.elements("book");// <book>(/book>
		for (Object object2 : elements) {
			Element book=(Element) object2;
			Element element = book.element("name");
			String text = element.getText();
			System.out.println(text);
		}
	}


b标签在a标签里,就是b标签依赖a标签。
完成创建bean的工厂

新建一个xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id ="P1"  class="com.bean.P1"></bean>
<bean id ="P2" class="com.bean.P2">
<property name="S1">com.bean.S1</property>
</bean>
<bean id="P3" class="com.bean.P3">
<property name="S2">com.bean.S2</property>
<property name="S3">com.bean.S3</property>
</bean>
</beans>

新建一个工厂模式
public class BeanFactory {
	public static Object getBean(String beanName) throws Exception{
//				1.创建一个容器来存放对象
				Map<String,Object> map =new HashMap<>();
//				2读取配置文件 以此创建对象
//				2.1创建解析器
				SAXReader reader = new SAXReader();
//				2.2加载配置文件
				Document document = reader.read("src/application.xml");
//				2.3获取根节点
				Element rootElement = document.getRootElement();
//				2.4获取元素bean元素
				List beans =rootElement.elements("bean");
//				2.5遍历bean
				for(Object object:beans){
					Element bean =(Element)object;
//					获取bean元素下面的子元素 property
					List props =bean.elements("property");
//					判断
					if(props.size()>0){
						for(Object object2:props){
							Element property =(Element)object2;
//						获取property的属性和文本 name text(类的全名)
						String name = property.attribute("name").getValue();//key
						String text = property.getText();
//						创建property下面的对象
						Object object3 =Class.forName(text).newInstance();//对象作为balue
						map.put(name,object3);
						}
					}
//					拿属性 id class
					String key = bean.attribute("id").getValue();//key
					String clazz = bean.attribute("class").getValue();
//					创建对象
					Object object4=Class.forName(clazz).newInstance();
//					将对象放在map中
					map.put(key, object4);
				}
				return map.get(beanName);
			}
}

新建一个测试类
public class Test1 {
	public static void main(String[] args) throws Exception {
		S1 bean = (S1) BeanFactory.getBean("S1");
		bean.run();
	}
}






xml与properties

结构上来说

xml是树形文件,properties主要以键值对的形式存在

灵活度上来说

xml文件要比properties灵活度高一点

便捷角度来说

properties要比xml配置简单

应用程度上来说

properties应用于小型项目,xml文件没有限制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值