关于xml解析的知识点


常见的两种资源文件是后缀为:properties和xml的
而静态资源文件就是,不同用户访问到的都是同一份内容,例如:css、js、html、图片、视屏等

properties文件读取

properties文件的解析方式有java.util.properties这个类来完成
根据存放位置

	1、根目录下
      	Xxx.class.getResourceAsStream("/config.properties");
	  2、与读取配置文件的类在同一包
      	Xxx.class.getResourceAsStream("config2.properties");
	3、WEB-INF(或其子目录下)
      ServletContext application = this.getServletContext();
     InputStream is = application.getResourceAsStream("/WEB-INF/config3.properties");
     
     为什么放在WEB-INF的文件必须要全局上下文才能取到呢?
     原因:WEB-INF是一个安全目录,也就是不能被外界访问的一个目录,只能通过内部配置web.xml通过servlet来访问

当我的文件在我的根目录下(Source Folder)

	public static void main(String[] args) throws IOException {
		//将当前同包下的db.properties资源文件转换成输入流
//		斜杆/ 代表根目录
		InputStream in = PropertiesDemo.class.getResourceAsStream("/db.properties");
		Properties p=new Properties();
		p.load(in);
		System.out.println(p.getProperty("uname"));
		System.out.println(p.getProperty("upass"));
	}

结果获取到了我db.properties文件的两个值
在这里插入图片描述
如果把文件放入WEB-INF中,有没有用上下文来获取时,就会报空指针异常
在这里插入图片描述
所以正确的获取方式是,写一个servlet,通过application来获取值,不同的是还有配置web.xml,同web来把文件的值打印到控制台

public class proServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		ServletContext context = req.getServletContext();	//声明一个全局上下文
		InputStream in = context.getResourceAsStream("/WEB-INF/db.properties");//获取到WEB_INF的文件
		Properties p=new Properties();
		p.load(in);
		System.out.println(p.getProperty("uname"));//打印到控制台
		System.out.println(p.getProperty("upass"));
	}
}

xml文件读取

根据文件存在的位置来取,是跟properties文件是一样的

xml文件:应该有一个工具类来完成
jdk/jdom
sax解析 由上往下解析 (移动端用的比较多)
dom4j解析 由外到内解析(目前最火的解析方式)

首先这是我的xml文件
在这里插入图片描述
我要通过dom4j+xpath解析xml文件,首先我们需要导入两个jar包dem4和jaxen(没有的可以去网上下载)
现在我们要获取到sid=s003的name值

	public static void main(String[] args) throws DocumentException {
		InputStream in = XmlParseDemo.class.getResourceAsStream("students.xml");
		SAXReader reader = new SAXReader();
		Document doc = reader.read(in);
//		System.out.println(doc.asXML());//输出整个xml文件的值
//		1、获取到所有的学生
		List<Element> stules = doc.selectNodes("/students/student");//查student这一组节点
//		2、遍历
		for (Element stu : stules) {
			if("s003".equals(stu.attributeValue("sid"))) {
				Node nameEle = stu.selectSingleNode("name");//查name单个节点
//				System.out.println(nameEle.asXML());//打印<name>小王</name>
				System.out.println(nameEle.getText());//打印小王,这是第一种方法,通过遍历判断
			}
		}
//		做判断、如果sid=s003那么拿到小王
		Node stuEleS003 = doc.selectSingleNode("/students/student[@sid='s003']");
		System.out.println(stuEleS003.selectSingleNode("name").getText());
	}

两种方法都放出来了,所以应该打印了两个小王
在这里插入图片描述

一个方法解析xml里所有文件节点内容

xml可以作为文件传输,每一个接口传输的xml节点及节点内容都不相同,怎么用一个xml解析方法解析多种格式的文件

思路:利用递归,从指定节点Element node开始,递归遍历其所有子节点,判断是否还存在子节点,直到没有子节点为止

案例:xml文件还是上面那个student.xml

	public static void main(final String[] args) throws Exception {
		Demo test = new Demo();
			test.testGetRoot();
	}
	/**
	 * 获取文件的xml对象,然后获取对应的根节点root
	 */
	public void testGetRoot() throws Exception {
		 SAXReader sax = new SAXReader();// 创建一个SAXReader对象
		 File xmlFile = new File("E:\\Desktop\\课件\\2、xml解析\\资料\\students.xml");// 根据指定的路径创建file对象
		 Document document = sax.read(xmlFile);// 获取document对象,如果文档无节点,则会抛出Exception提前结束
		 Element root = document.getRootElement();// 获取根节点
		getNodes(root);// 从根节点开始遍历所有节点
	}

/**
	 * 从指定节点Element node开始,递归遍历其所有子节点
	 */
	public void getNodes(final Element node) {
		// 当前节点的名称、文本内容和属性
		System.out.println( node.getTextTrim());// 当前节点内容
		 List<Attribute> listAttr = node.attributes();// 当前节点的所有属性
		for ( Attribute attr : listAttr) {// 遍历当前节点的所有属性
			 String name = attr.getName();// 属性名称
			 String value = attr.getValue();// 属性的值
			System.out.println("属性名称:" + name + "---->属性值:" + value);
		}
		// 递归遍历当前节点所有的子节点
		 List<Element> listElement = node.elements();// 所有一级子节点的list
		for ( Element e : listElement) {// 遍历所有一级子节点
			getNodes(e);// 递归
		}
	}

最后结果为:那student.xml的所有节点内容全部打印

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不愿秃头的阳某

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值