工具思想在java学习中尤为重要。由于工具的存在,我们才能把心思放在真正的代码编写中,而不是被那些大量重复的代码搞的晕头转向的。要知道java的终极目标是代码复用!!!
那让我们以上上篇博文为例,将其变成一个xml解析工具。
这就是我们所给出的xml解析工具:XMLParser类
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public abstract class XMLParser
{
private static final DocumentBuilderFactory dbf;
private static DocumentBuilder db;
static
{
dbf=DocumentBuilderFactory.newInstance();
try
{
db=dbf.newDocumentBuilder();
}
catch(ParserConfigurationException e)
{
e.printStackTrace();
}
}
public XMLParser()
{}
public static Document getDocument(String xmlPath)
{
InputStream is=XMLParser.class.getResourceAsStream(xmlPath);
if(is == null)
{
System.out.println("xmlPath[" + xmlPath + "]不存在!");
return null;
}
return getDocument(is);
}
public static Document getDocument(InputStream is)
{
Document document=null;
try
{
document=db.parse(is);
}
catch(SAXException e)
{
e.printStackTrace();
}
catch(IOException e)
{
e.printStackTrace();
}
return document;
}
public abstract void dealElement(Element element, int index);
public void parseTag(Document document, String tagName)
{
NodeList nodeList=document.getElementsByTagName(tagName);
for(int index=0; index < nodeList.getLength(); index++)
{
Element ele=(Element) nodeList.item(index);
dealElement(ele, index);
}
}
public void parseTag(Element element, String tagName)
{
NodeList nodeList=element.getElementsByTagName(tagName);
for(int index=0; index < nodeList.getLength(); index++)
{
Element ele=(Element) nodeList.item(index);
dealElement(ele, index);
}
}
}
再给出一个测试类Test
import org.w3c.dom.Element;
public class Test
{
public static void main(String[] args)
{
new XMLParser()
{
@Override
public void dealElement(Element element, int index)
{
StudentInfo stu=new StudentInfo();
String id=element.getAttribute("id");
stu.setId(id);
String name=element.getAttribute("name");
stu.setName(name);
String sex=element.getAttribute("sex");
stu.setSex(sex);
new XMLParser()
{
@Override
public void dealElement(Element element, int index)
{
String hobbyString=element.getTextContent();
stu.addHobby(hobbyString);
}
}.parseTag(element, "hobby");
new XMLParser()
{
@Override
public void dealElement(Element element, int index)
{
String motto=element.getTextContent().trim();
stu.setMotto(motto);
}
}.parseTag(element, "motto");
System.out.println(stu);
}
}.parseTag(XMLParser.getDocument("/student.xml"), "student");
}
}
这样做可以在以后要使用XML解析时,不用再重新编写一个XMLParse,而是直接修改Test类里面的一些参数。
执行结果如下:
可以看到与上篇博文的运行结果,一般无二。那为什么还要推崇这种写法呢?
java面向对象编程者的品德——辛苦我一人,幸福千万家!
java编程的要点是:先编写工具,再用工具完成开发任务!而且,在编写这些工具的时候,要始终将“代码复用”,即,已经定义好的类,在未来由自己重复使用,或者由他人重复使用,的思想贯彻始终!这才是面向对象编程思想的精髓所在!!!