因为只需要获取、设置、保存这三个功能,所有写了如下接口
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();调用
分享到:
相关推荐
在LabVIEW(Laboratory Virtual Instrument Engineering Workbench)这个强大的图形化编程环境中,XML解析器是处理和操作XML数据的关键工具。本示例主要展示了如何在LabVIEW中实现XML文件的加载、保存和解析。 首先...
简易XML解析器是针对XML文档进行读取、解析和操作的工具,通常用于处理XML数据并将其转换为程序可理解的形式。 在提供的文件中,我们可以看到以下几个关键组成部分: 1. **xCfgParser.cpp**:这是解析器的主要实现...
标签"XML解析器"和"下载JAR包"进一步明确了这个资源的关键信息,即这是一个与XML解析相关的Java库,并且是以可下载的JAR形式提供的。 在压缩包子文件的文件名称列表中提到了"xml解析器jdom的jar包",这意味着包含的...
XML解析器有两种主要类型:DOM(Document Object Model)解析器和SAX(Simple API for XML)解析器。 1. DOM解析器:DOM解析器会将整个XML文档加载到内存中,创建一个树形结构,允许开发者通过节点来访问和修改XML...
根据解析方式,XML解析器主要分为两种类型:DOM(Document Object Model)解析器和SAX(Simple API for XML)解析器。 1. DOM解析器:DOM解析器将整个XML文档加载到内存中,创建一个树形结构,允许开发者通过节点...
这些内容展示了如何在C语言环境下使用Expat解析器来处理XML文件,包括解析过程中的内存管理和节点访问。 注意,由于文档内容是OCR扫描的结果,某些字符可能存在错误,需要结合上下文来推断正确含义。但总体而言,...
1. **DOM解析器**:Document Object Model (DOM) 提供了一种结构化的表示XML文档的方式,允许程序员通过树形结构访问和操作XML元素。Xerces-J的DOM解析器将整个XML文档加载到内存中,方便进行遍历和修改。 2. **SAX...
例如,可以先使用SAX解析器解析XML文件,然后利用DOM或SAX构造器将处理后的数据写回XML。 了解了基本概念后,我们可以进一步探讨一些高级话题,如XPath和XSLT: 1. XPath:这是一种在XML文档中查找信息的语言。...
本项目是一个在Visual C++(VC)环境下开发的简单XML解析器,主要关注于理解和处理XML文档的内容。 XML解析是理解XML文档结构并从中提取数据的关键步骤。在这个VC项目中,XML解析器实现了对XML文档的基本解析功能,...
《XML解析器与简单工厂模式》 XML(eXtensible Markup Language)是一种标记语言,广泛用于数据交换、配置文件存储等场景。在Java中,处理XML文档时,我们通常会使用解析器,其中SAX(Simple API for XML)解析器是...
这是一个用c++实现的简单的xml的解析器
4. **SAX解析**:与DOM不同,SAX解析器不将整个XML文档加载到内存,而是通过事件回调函数处理每个元素的开始和结束、处理属性等。在易语言中,我们需要定义一系列的事件处理函数,如`开始文档`、`结束文档`、`开始...
在C++中实现XML解析器是一项技术挑战,但通过合理的封装和设计,可以创建一个高效且易用的接口来处理XML文件。 XML文件结构由元素(Element)、属性(Attribute)、文本内容(Text Content)以及一系列的语法规则...
在Windows环境下,XML解析器是处理和解析XML文档所必需的组件。本文将详细讲解如何安装“XML解析器安装包”,以及在MFC(Microsoft Foundation Classes)中如何利用它来调用IXMLDOMDocumentPtr类的函数。 首先,...
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,...
本压缩包提供了一套XML解析器的源代码,旨在帮助开发者理解和实现XML的解析过程。 在"xml.cpp"和"xdb.cpp"文件中,我们可以找到XML解析器的核心实现。这些源代码通常包含了读取XML文档,解析元素、属性、文本节点,...
总之,"xml-binding XML解析器"是C++开发者处理XML数据的一种强大工具,它基于成熟的XML_Parser库并提供了C++的友好接口,使XML解析变得更加简单和高效。通过深入理解和应用这个库,开发者可以更好地驾驭XML数据,...
- **XML解析器**:解析器负责将XML文档转换为可操作的数据结构,如DOM(Document Object Model)树,以便JavaScript代码可以访问和操作。 2. **JavaScript中的XML解析** - **DOM解析**:JavaScript中最常见的XML...
`Markup.cpp`和`Markup.h`可能实现了一个简单的XML解析器或生成器。在C++中,可以使用这些文件创建自定义的解析器,处理XML数据。通常,解析器会提供以下功能: - 解析XML文档,生成元素对象。 - 处理元素的属性和...