先得到dom解析后的文档树,和root元素.
然后递归解析,这个程序中没说明如何保存相应节点的值,如果要用hashtable数据结构保存各个节点的值,程序还得做相应调整,因为在这个递归中textvalue是在子调用中输出的,还得返回到上一层,跟父函数的节点名字对应
DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
try {
DocumentBuilder dombuilder=domfac.newDocumentBuilder();
//InputStream is=new FileInputStream("library.xml");
InputStream is=new FileInputStream("library.xml");
Document doc=dombuilder.parse(is);
Element root=doc.getDocumentElement();//根节点
}
/*******************************************************************/
得到root后,进行递归调用,解析xml
public void digui(Node root)
{
if(root.getNodeType()==Node.TEXT_NODE)
{
//root.getNodeValue()为所要文本
return ;
}
//获得root节点对应的所有属性值
getAttributes(root);
for(Node node=root.getFirstChild();node!=null;node=node.getNextSibling())
{//这里用这个方式比较合适,如果把textvalue拿到这里来输出,就需要判断是不是ELEMENT_NODE类型,因为
//textvalue也是node的孩子,但它是TEXT_NODE类型的,无孩子节点
//对于一个节点,node.getFirstChild().getNodeValue()才是这个节点的value
digui(node);
}
}
public void getAttributes(Node root)//获得root节点的所有属性值
{
NamedNodeMap map = root.getAttributes();//输出某个元素的属性部分
if(map==null)
{
System.out.println("point null");
}
else
{
for(int i=0;i<map.getLength();i++)//输出某个元素的属性部分,这里的getLength函数得到的长度也确实是
{ //root节点所拥有的属性的个数
Node node = map.item(i);
Node nodename = map.getNamedItem("size");
if(node.getNodeType()==Node.ATTRIBUTE_NODE)//这个其实可以不判断,肯定是属性节点
{
if(node.getNodeName().equalsIgnoreCase("size"))
{
System.out.println("size: "+node.getNodeValue());
}
else if(node.getNodeName().equalsIgnoreCase("height"))
{
System.out.println("height: "+node.getNodeValue());
}
}
}
}
}