加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML系列:(4)XML解析-JAXP的DOM解析方式读取XML

发布时间:2020-12-16 08:37:59 所属栏目:百科 来源:网络整理
导读:DOM、SAX和StAX只是解析方式,没有API。 JAXP是SUN提供的一套XML解析API。 JAXP(Java API for XMLProcessing,意为XML处理的Java API) JAXP很好的支持DOM和SAX解析。 JAXP开发包是JAVASE的一部分,它由java.xml、org.w3c.dom、org.xml.sax包及其子包组成 p


DOM、SAX和StAX只是解析方式,没有API。

JAXP是SUN提供的一套XML解析API。 JAXP(Java API for XMLProcessing,意为XML处理的Java API)

JAXP很好的支持DOM和SAX解析。

JAXP开发包是JAVASE的一部分,它由java.xml、org.w3c.dom、org.xml.sax包及其子包组成


products.mxl

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEproducts[
<!ELEMENTproducts(product+)>
<!ELEMENTproduct(name,price)>
<!ELEMENTname(#PCDATA)>
<!ELEMENTprice(#PCDATA)>
<!ATTLISTproductidID#REQUIRED>
]>
<products>
<productid="p001">
<name>往事并不如烟</name>
<price>49.9元</price>
</product>
<productid="p002">
<name>围城</name>
<price>59.9元</price>
</product>
</products>


1、以DOM解析方式读取XML


1.1、根据Id读取一个元素(Element)

packagecom.rk.xml.d_jaxp_dom;

importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.DocumentBuilder;
importorg.w3c.dom.Document;
importorg.w3c.dom.Element;

/**
*根据Id读取一个元素(Element)
*通过Document.getElementById(StringelementId)方法获取一个元素(Element)
*@authorRK
*
*/
publicclassDemo01
{
	publicstaticvoidmain(String[]args)throwsException
	{
		//1、新拿到解析器工厂
		//2、通过解析器工厂拿到解析器对象
		//3、通过解析器对象解析XML文档,并返回Document对象
		//4、通过Document对象去获取节点Node
		
		//1、新拿到解析器工厂
		DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance();
		//2、通过解析器工厂拿到解析器对象
		DocumentBuilderbuilder=builderFactory.newDocumentBuilder();
		//3、通过解析器对象解析XML文档,并返回Document对象
		Documentdoc=builder.parse("./src/products.xml");
		//4、通过Document对象去获取节点Node
		Elementelem=doc.getElementById("p001");//必须使用DTD声明ID属性
		System.out.println(elem);//[product:null]
		System.out.println(elem.getNodeType());//1		元素(Element)类型的节点用1表示
		System.out.println(elem.getNodeName());//product
		System.out.println(elem.getNodeValue());//null
		System.out.println(elem.getTextContent());//往事并不如烟49.9元
	}
}



1.2、读取一系列节点(NodeList)

packagecom.rk.xml.d_jaxp_dom;

importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.DocumentBuilder;
importorg.w3c.dom.Document;
importorg.w3c.dom.NodeList;
importorg.w3c.dom.Node;

/**
*读取一系列节点(NodeList)
*通过Document.getElementsByTagName(Stringtagname)获取一系列节点。
*@authorRK
*
*/
publicclassDemo02
{
	publicstaticvoidmain(String[]args)throwsException
	{
		//1、新拿到解析器工厂
		//2、通过解析器工厂拿到解析器对象
		//3、通过解析器对象解析XML文档,并返回Document对象
		//4、通过Document对象去获取节点Node
		
		//1、新拿到解析器工厂
		DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance();
		//2、通过解析器工厂拿到解析器对象
		DocumentBuilderbuilder=builderFactory.newDocumentBuilder();
		//3、通过解析器对象解析XML文档,并返回Document对象
		Documentdoc=builder.parse("./src/products.xml");
		//4、通过Document对象去获取节点Node
		NodeListlist=doc.getElementsByTagName("product");
		
		System.out.println("找到"+list.getLength()+"个");//找到多少个节点
		
		for(inti=0;i<list.getLength();i++)
		{
			Nodenode=list.item(i);
			System.out.println(node);//将各个节点进行打印
		}
	}

}



1.3、读取一个属性(Attribute)

packagecom.rk.xml.d_jaxp_dom;

importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.DocumentBuilder;
importorg.w3c.dom.Document;
importorg.w3c.dom.Node;
importorg.w3c.dom.NodeList;
importorg.w3c.dom.NamedNodeMap;

/**
*读取一个属性(Attribute)
*@authorRK
*
*/
publicclassDemo03
{
	publicstaticvoidmain(String[]args)throwsException
	{
		DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance();
		DocumentBuilderbuilder=builderFactory.newDocumentBuilder();
		Documentdoc=builder.parse("./src/products.xml");
		NodeListlist=doc.getElementsByTagName("product");
		Nodenode=list.item(0);
		NamedNodeMapmap=node.getAttributes();//获取到所有属性类型的节点
		NodeattrNode=map.getNamedItem("id");//获取到属性为“id”的节点
		System.out.println(attrNode.getNodeType());//2	属性(Attribute)类型的节点用2表示
		System.out.println(attrNode.getNodeName());//id
		System.out.println(attrNode.getNodeValue());//p001
		System.out.println(attrNode.getTextContent());//p001
	}
}



1.4、读取一个元素的文本(Text)

packagecom.rk.xml.d_jaxp_dom;

importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.DocumentBuilder;
importorg.w3c.dom.Document;
importorg.w3c.dom.NodeList;
importorg.w3c.dom.Node;

/**
*读取一个元素的文本(Text)
*@authorRK
*
*/
publicclassDemo04
{
	publicstaticvoidmain(String[]args)throwsException
	{
		DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance();
		DocumentBuilderbuilder=builderFactory.newDocumentBuilder();
		Documentdoc=builder.parse("./src/products.xml");
		NodeListlist=doc.getElementsByTagName("name");
		Nodenode=list.item(0);
		System.out.println(node.getTextContent());//往事并不如烟
	}

}




1.5、遍历Document对象树

packagecom.rk.xml.d_jaxp_dom;

importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.DocumentBuilder;
importorg.w3c.dom.Document;
importorg.w3c.dom.NodeList;
importorg.w3c.dom.Node;
importorg.w3c.dom.NamedNodeMap;

/**
*遍历所有节点
*@authorRK
*
*/
publicclassDemo05
{
	publicstaticvoidmain(String[]args)throwsException
	{
		DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance();
		DocumentBuilderbuilder=builderFactory.newDocumentBuilder();
		Documentdoc=builder.parse("./src/products.xml");
		StringBuildersb=newStringBuilder();
		
		NodeListchildNodes=doc.getChildNodes();
		for(inti=0;i<childNodes.getLength();i++)
		{
			Nodenode=childNodes.item(i);
			System.out.println(node.getNodeType()+"==="+node.getNodeName()+"==="+node.getNodeValue());
		}
		/*
		输出结果:
		10===products===null				DOCUMENT_TYPE_NODE=10
		1===products===null				ELEMENT_NODE=1

		*/
		
		traverseDocument(doc.getLastChild(),sb);
		System.out.println(sb.toString());
		
		/*
		输出结果:
		<products>
			<productid="p001">
				<name>往事并不如烟</name>
				<price>49.9元</price>
			</product>
				<productid="p002">
				<name>围城</name>
				<price>59.9元</price>
			</product>
		</products>	
		*/
	}

	privatestaticvoidtraverseDocument(Nodenode,StringBuildersb)
	{
		//1、当前元素开始
		sb.append("<"+node.getNodeName()+"");
		//2、获取属性
		
		if(node.hasAttributes())
		{
			NamedNodeMapnodeMap=node.getAttributes();
			for(inti=0;i<nodeMap.getLength();i++)
			{
				NodeattrNode=nodeMap.item(i);
				sb.append(attrNode.getNodeName()+"=""+attrNode.getNodeValue()+""");
			}
		}
		sb.append(">");
		
		//3、获取子节点
		NodeListchildNodes=node.getChildNodes();
		for(inti=0;i<childNodes.getLength();i++)
		{
			NodesubNode=childNodes.item(i);
			shorttype=subNode.getNodeType();
			if(type==1)//当前节点是Element节点
			{
				traverseDocument(subNode,sb);
			}
			elseif(type==3)//当前节点是Text节点
			{
				sb.append(subNode.getTextContent());
			}
			else
			{
				//其它情况,不做处理
			}
		}
		
		//4、当前元素结束
		sb.append("</"+node.getNodeName()+">");
	}
}







2、思维导图

wKioL1c1yi6BT_l9AAF49VEDzyg283.png

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读