当前位置:首页 > 开发 > 编程语言 > XML > 正文

BlogContext和简单xml解析器

发表于: 2010-05-23   作者:酷的飞上天空   来源:转载   浏览:
摘要: 因为只需要获取、设置、保存这三个功能,所有写了如下接口   XmlHandle内容 public interface XmlHandle { public String getValueOfTagName(String tagName); public void setValueOfTagName(String tagName,String value); publ

因为只需要获取、设置、保存这三个功能,所有写了如下接口

 

XmlHandle内容

public interface XmlHandle {

	public String getValueOfTagName(String tagName);
	public void setValueOfTagName(String tagName,String value);
	public void saveXml();
}

 

实现类SimpleXmlHandle如下

public class SimpleXmlHandle implements XmlHandle {

	Document document;
	String xmlFilePath;
	public SimpleXmlHandle(String xmlFilePath){
		this.xmlFilePath = xmlFilePath;
		init();
	}
	private void init(){
		try {
			document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xmlFilePath);
		} catch (Exception e) {
			LogUtil.error(this.getClass().getName(), "解析blog.xml文件失败!");
			throw new RuntimeException(e);
		}
	}
	@Override
	public String getValueOfTagName(String tagName) {
		//根据标签的名称取得标签,一个list
		NodeList nodeList = document.getElementsByTagName(tagName);
		//如果找不到相应标签,则返回null
		if(nodeList.getLength()==0) return null;
		//返回取得的标签列表的第一个标签(即重复定义标签时,只有第一个有效),最后再返回该标签的第一个文本节点。
		Node node = nodeList.item(0).getFirstChild();
		//返回去掉首位空格的文本节点的值,。
		return node.getNodeValue().trim();
	}
	@Override
	public void setValueOfTagName(String tagName, String value) {
		NodeList nodeList = document.getElementsByTagName(tagName);
		Node node = nodeList.item(0).getFirstChild();
		node.setNodeValue(value);
	}
	public void saveXml(){
		try {
			Transformer transformer = TransformerFactory.newInstance().newTransformer();
			transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, document.getDoctype().getSystemId());
			StreamResult streamResult = new StreamResult(new File(xmlFilePath));
			DOMSource source = new DOMSource(document);
			transformer.transform(source, streamResult);
		} catch (Exception e) {
			throw new RuntimeException(e);			
		}
	} 

}

 

从构造方法里面获得xml的路径,调用init(),方法进行xml文件的解析(使用dom方式)。得到解析好的xml文件的dom树

getValueOfTagName方法根据传递进来的字符串,查找对应的名标签的值。具体方法注释都有

setValueOfTagName方法与get方法相似。

transformer 则用于把当前的dom树转换为xml文档

 

BlogContext内容如下

public class BlogContext {
	/**
	 * 代表文章的分类标志
	 */
	public static final int ARTICLE_MARK = 0;
	/**
	 * 代表图片的分类标志
	 */
	public static final int PHOTOS_MARK = 1;
	
	private User user;
	private String databaseUrl;
	private String databaseUser;
	private String databasePassWord;
	private XmlHandle xmlHandle;
	public void init(){
		if(xmlHandle==null)
			throw new RuntimeException("xmlHandle不能为空!");
		user = new User();
		user.setBlogTitle(xmlHandle.getValueOfTagName("blogTitle"));
		user.setAboutMe(xmlHandle.getValueOfTagName("aboutMe"));
		user.setDegree(xmlHandle.getValueOfTagName("degree"));
		user.setFindMe(xmlHandle.getValueOfTagName("findMe"));
		user.setHeadImg(xmlHandle.getValueOfTagName("headImg"));
		user.setHobby(xmlHandle.getValueOfTagName("hobby"));
		user.setHome(xmlHandle.getValueOfTagName("home"));
		user.setiWantSay(xmlHandle.getValueOfTagName("iWantSay"));
		user.setLoginPassWord(xmlHandle.getValueOfTagName("loginPassWord"));
		user.setNickName(xmlHandle.getValueOfTagName("nickName"));
		user.setNowAddress(xmlHandle.getValueOfTagName("nowAddress"));
		user.setSex(xmlHandle.getValueOfTagName("sex"));
		String yearNum = xmlHandle.getValueOfTagName("year");
		Integer year = null;
		year = Integer.parseInt(yearNum);
		user.setYear(year);
		user.setLastLogin(xmlHandle.getValueOfTagName("lastLogin"));
		this.databaseUrl = xmlHandle.getValueOfTagName("url");
		this.databaseUser = xmlHandle.getValueOfTagName("user");
		this.databasePassWord = xmlHandle.getValueOfTagName("password");
	}
	public void destroyed(){
		xmlHandle.setValueOfTagName("aboutMe", user.getAboutMe());
		xmlHandle.setValueOfTagName("degree", user.getDegree());
		xmlHandle.setValueOfTagName("findMe", user.getFindMe());
		xmlHandle.setValueOfTagName("headImg", user.getHeadImg());
		xmlHandle.setValueOfTagName("hobby", user.getHobby());
		xmlHandle.setValueOfTagName("home", user.getHome());
		xmlHandle.setValueOfTagName("iWantSay", user.getiWantSay());
		xmlHandle.setValueOfTagName("loginPassWord", user.getLoginPassWord());
		xmlHandle.setValueOfTagName("nickName", user.getNickName());
		xmlHandle.setValueOfTagName("nowAddress", user.getNowAddress());
		xmlHandle.setValueOfTagName("sex", user.getSex());
		xmlHandle.setValueOfTagName("year", user.getYear().toString());
		xmlHandle.setValueOfTagName("lastLogin", user.getLastLogin());
		xmlHandle.setValueOfTagName("blogTitle", user.getBlogTitle());
		xmlHandle.saveXml();
	}
               //get,set略
           	public static BlogContext getInstance(){
		return BlogFilter.getBlogContext();
	}
}

 前两个字段是因为文章和相册公用同一张表,所以设置一个辨别的标志

  init方法用于从解析的xml中取得数据并给user设置值,以及取得连接数据库的必须信息。jdbc4不需要指定drverClass,所以这里没有。此方法在AbstractFilter的init方法被调用执行。

destroyed用于把已经更改或未更改的用户信息,设置回dom树。并把更改好的dom树保存到xml文件中。此方法在AbstractFilter的destroy方法被调用

getInstance则用于提供一个获取User的方式,也可在servlet直接使用BlogFilter.getBlogContext();调用

 

BlogContext和简单xml解析器

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
XML自动解析器开源咯, 这东西写出来很久了,自己也用了很长时间,感觉没什么bug了今天才独立放出来
常用XML解析器分为两类 DOM解析器和SAX解析器 DOM解析XML时,读入整个XML文档并构建一个驻留内存的
Sun公司的jaxp解析中的sax解析: 首先通过javax.xml.parsers.SAXParserFactory类创建工厂 SAXParser
对xml的解析,我们在将j2ee中,常使用的解析器是DOM和SAX。而在android中,我们还可以使用PULL解析
Android中使用Pull解析器解析xml文件+进行简单的单元测试 我来给大家介绍Android用得最多的一种解析
Android中使用Pull解析器解析xml文件+进行简单的单元测试 我来给大家介绍Android用得最多的一种解析
SAX / DOM 解析在JAVA中已经学习,这里只对pull解析器方法进行描述 如下xml: Person.xml <?xml
TinyXML-2 is a simple, small, efficient, C++ XML parser that can be easily integrating into o
Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其ja
Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其ja
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号