获取properites文件与xml dom4j的解析
二,获取properites文件
不同位置对properites文件的调用:
1、若调用的文件就在该类的包中时:
public class properitesDemo {
public static void main(String[] args) throws IOException {
InputStream in = properitesDemo.class.getResourceAsStream("db.properties");//获取到该包下的properites文件
Properties p = new Properties();//实列化properties
p.load(in); //读取文件里的资源
String name = p.getProperty("uname"); //根据名字获取字符
System.out.println(name);
}
}
2、若调用的文件在其它的包中时:
将 properitesDemo.class.getResourceAsStream("db.prope rties");
改为 properitesDemo.class.getResourceAsStream("/db.properties");
3、若调用的文件在WEB-INF中时:需要配置Servlet
public class properitesServlet extends HttpServlet {
private static final long serialVersionUID = 7973003110170094853L;
@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();//这里的代码是本类的ServletContext去获得的
InputStream in = context.getResourceAsStream("/WEB-INF/db.properties");//获取相对应的位置文件
Properties p = new Properties();//因为还是properites文件
p.load(in);
System.out.println(p.getProperty("uname"));
}
}
配置:
<servlet>
<servlet-name>proServlet</servlet-name>//配置的名字
<servlet-class>com.liwangwang.pares.properitesServlet</servlet-class>//绝对路径
</servlet>
<servlet-mapping>
<servlet-name>proServlet</servlet-name>//配置的名字
<url-pattern>/proServlet</url-pattern>//引用时的地址
</servlet-mapping>
一,xml解析
1.xml简介
XML即可扩展标记语言(eXtensible Markup Language)。标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。
通俗的讲,XML文件一般用来保存有关系的数据。除此之外,在程序开发中,我们通常用来做各种框架的配置文件。
2.XML 文件由以下几个部分组成:
①、文档声明
②、元素
③、属性
④、注释
⑤、CDATA区、特殊字符
⑥、处理指令(processing intruction)
3.xml解析之dom4j
XML的解析方式有很多,光开源的就有十多种:如Xerces、JDOM、DOM4J、XOM、JiBX、KXML、XMLBeans、jConfig、XStream、XJR等。
但是最常用的还是sax、dom、dom4j
4.xml文件读取
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());
}
两种方法都放出来了,所以应该打印了两个小王
5.一个方法解析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:\\Y2\\课件\\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);// 递归
}
}
6. Dom4f合并多个xml文件
SAXReader saxReader = new SAXReader();
Document a = saxReader.read(new File("g:\\taskChain.xml")); //文件一
Document b = saxReader.read(new File("g:\\taskChain2.xml")); //文件二
List<Element> elements = b.getDocument().getRootElement().elements();//获得根节点下的节点信息
Element parent = (Element) a.getRootElement();//获得第一个xml的根节点
for (Element element : elements) {
parent.add(element.detach());//将b下的节点添加到a的根节点下
}
System.out.println(a.asXML());