XPath解析xml
2023-03-01 本文已影响0人
牵手生活
Java 解析xml常用的方式:
1:dom解析XML:它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作。--耗内存
2:SAX(Simple API for XML)解析XML:SAX不用将整个文档加载到内存,基于事件驱动的API(Observer模式),他按照xml文件的顺序一步一步的来解析,用户只需要注册自己感兴趣的事件即可。SAX没有文档修改、随机访问及输出的功能
3:JDOM解析XML
4:DOM4j解析XML
详细参考:http://www.51gjie.com/java/739.html
付:java常用dom4j简单生成XML文件
下面采用dom方式解析
Java XPath解析XML总结-XPath解析XML步骤
Java XML解析 - 利用dom(org.w3c.dom)解析XML
下面解析memberlist 下的成员
xml文本
<sysmsg type="sysmsgtemplate">
<sysmsgtemplate>
<content_template type="tmpl_type_profile">
<plain><![CDATA[]]></plain>
<template><![CDATA["$ownername$"已成为新群主]]></template>
<link_list>
<link name="ownername" type="link_profile">
<memberlist>
<member>
<username><![CDATA[youngcat]]></username>
<nickname><![CDATA[牵手可能2]]></nickname>
</member>
<member>
<username><![CDATA[makeboluo]]></username>
<nickname><![CDATA[马可波罗]]></nickname>
</member>
</memberlist>
</link>
</link_list>
</content_template>
</sysmsgtemplate>
</sysmsg>
解析代码
@Test
public void testParase_sysmsg_roomOpt2() throws XPathExpressionException {
XPathFactory pathFactory = XPathFactory.newInstance();
XPath xpath = pathFactory.newXPath();
InputStream in =getClass().getResourceAsStream("/msg_sysmsg_roomAcceptedNewOwner_field_content_2.txt");
InputSource source = new InputSource( in ); //InputSource使用一次就会关闭,再次使用就用再new一次。
//String query_sentences = "/sysmsg/sysmsgtemplate/content_template";
//String query_sentences = "/sysmsg/sysmsgtemplate/content_template/link_list/link/memberlist/member";
String query_sentences = "/sysmsg/sysmsgtemplate/content_template/link_list/link/memberlist/member";
Object result = xpath.evaluate(query_sentences,source, XPathConstants.NODESET);
NodeList nodes_member = (NodeList) result;
List memberList = new ArrayList();
for (int i = 0; i < nodes_member.getLength(); i++) {//????如何去除Node中的值呢?
Map<String,Object> map_member = new HashMap<>();
Node node_member = nodes_member.item(i);
Element element = (Element) nodes_member.item(i);
// System.out.println("username: " + element.getElementsByTagName("username").item(0).getFirstChild().getNodeValue());
// System.out.println("nickname: " + element.getElementsByTagName("nickname").item(0).getFirstChild().getNodeValue());
map_member.put("username",element.getElementsByTagName("username").item(0).getFirstChild().getNodeValue());
map_member.put("nickname",element.getElementsByTagName("nickname").item(0).getFirstChild().getNodeValue());
memberList.add(map_member);
}
System.out.println(new Gson().toJson(memberList));
}
测试代码效果
image.png