怎样xml获取指定节点XML中的注释节点

java解析xml常用的三种方法 -
- ITeye技术网站
博客分类:
(I)Java通过DOM解析XML
1&得到DOM解析器的工厂实例  DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();  得到javax.xml.parsers.DocumentBuilderF类的实例就是我们要的解析器工厂  2&从DOM工厂获得DOM解析器  DocumentBuilder dombuilder=domfac.newDocumentBuilder();  通过javax.xml.parsers.DocumentBuilderFactory实例的静态方法newDocumentBuilder()得到DOM解析器  3&把要解析的XML文档转化为输入流,以便DOM解析器解析它  InputStream is=new FileInputStream("bin/library.xml");  InputStream是一个接口。
4&解析XML文档的输入流,得到一个Document  Document doc=dombuilder.parse(is);  由XML文档的输入流得到一个org.w3c.dom.Document对象,以后的处理都是对Document对象进行的  5&得到XML文档的根节点  Element root=doc.getDocumentElement();  在DOM中只有根节点是一个org.w3c.dom.Element对象。  6&得到节点的子节点  NodeList books=root.getChildNodes();  for(int i=0;i&books.getLength();i++){ Node book=books.item(i);  }   这是用一个org.w3c.dom.NodeList接口来存放它所有子节点的,还有一种轮循子节点的方法,后面有介绍  7&取得节点的属性值  String email=book.getAttributes().getNamedItem("email").getNodeValue();  System.out.println(email);  注意,节点的属性也是它的子节点。它的节点类型也是Node.ELEMENT_NODE  8&轮循子节点  for(Node node=book.getFirstChild();node!=node=node.getNextSibling()){      if(node.getNodeType()==Node.ELEMENT_NODE){      
if(node.getNodeName().equals("name")){       String name=node.getNodeValue();        String name1=node.getFirstChild().getNodeValue();       ...        if(node.getNodeName().equals("price")){        String price=node.getFirstChild().getNodeValue();...  
&?xml version="1.0" encoding="UTF-8"?&
&conn-params&
&conn-url&jdbc:mysql://192.168.101.7:3306/bbs&/conn-url&
&conn-driver&com.mysql.jdbc.Driver&/conn-driver&
&conn-username&root&/conn-username&
&conn-password&root&/conn-password&
&/conn-params&
&username&xzc&/username&
&password&sdf23223&/password&
&birthday&&/birthday&
&username&误闯&/username&
&password&wuchuang3223&/password&
&birthday&&/birthday&
////////////////////////////////////////////////////////////////////////////////////
package com.xcz.
import java.io.F
import java.io.IOE
import java.util.L
import javax.xml.parsers.ParserConfigurationE
import org.xml.sax.SAXE
import com.xcz.po.U
import com.xcz.xml.util.DomU
public class Dom4Xml {
private DomUtil domUtil = new DomUtil();
public static void main(String[] args) {
File f = new File("src/jdbc-params.xml");
List&User& list = new Dom4Xml().domUtil.parseXml(f);
for (User user : list) {
System.out.println(user);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
////////////////////////////////////////////////////////////////////////////////////
package com.xcz.xml.
import java.io.F
import java.io.IOE
import java.util.ArrayL
import java.util.L
import javax.xml.parsers.DocumentB
import javax.xml.parsers.DocumentBuilderF
import javax.xml.parsers.ParserConfigurationE
import org.w3c.dom.D
import org.w3c.dom.E
import org.w3c.dom.N
import org.w3c.dom.NodeL
import org.xml.sax.SAXE
import com.xcz.po.U
public class DomUtil {
private DocumentBuilderF
private DocumentB
private List&User&
* 创建一个DocumentBuilderFactory 对象
* @return DocumentBuilderFactory
private DocumentBuilderFactory getDocumentBuilderFactory(){
return DocumentBuilderFactory.newInstance();
* 创建一个DocumentBulider 对象
* @param DocumentBuilderFactory fac
* @return DocumentBuilder
* @throws ParserConfigurationException
private DocumentBuilder getDocumentBuilder(DocumentBuilderFactory fac) throws ParserConfigurationException{
return fac.newDocumentBuilder();
* 功能:解析XML文件
* @param file xml文件
* @return List&User&
* @throws ParserConfigurationException
* @throws SAXException
* @throws IOException
public List&User& parseXml(File file) throws ParserConfigurationException, SAXException, IOException{
factory = getDocumentBuilderFactory();
builder = getDocumentBuilder(factory);
document = builder.parse(file);
List&User& list = parseXmlProcess(document);
* 功能:xml文件具体解析过程
* @param document
* @return List&User&
private List&User& parseXmlProcess(Document document){
list = new ArrayList&User&();
//获取根节点
Element root = document.getDocumentElement();
//获取根节点下面的所有孩子节点
NodeList childNodes = root.getChildNodes();
for(int i=0; i&childNodes.getLength(); i++){//获取节点集合长度:getLength()
Node node = childNodes.item(i);//获取第index 节点:item(index)
if("person".equals(node.getNodeName())){//获取当前节点tagName:getNodeName()
NodeList pChildNodes = node.getChildNodes();
for(int p=0; p&pChildNodes.getLength(); p++){
Node pNode = pChildNodes.item(p);
if("user".equals(pNode.getNodeName())){
User user = new User();
NodeList uChildNodes = pNode.getChildNodes();
for(int u=0;u&uChildNodes.getLength();u++){
Node uNode = uChildNodes.item(u);
if("username".equals(uNode.getNodeName())){
user.setUsername(uNode.getTextContent());//获取当前节点的具体内容:getTextContent()
if("password".equals(uNode.getNodeName())){
user.setPassword(uNode.getTextContent());
if("birthday".equals(uNode.getNodeName())){
user.setBirthday(uNode.getTextContent());
list.add(user);
(II)Java通过SAX解析XML
一个实现SAX的解析器(也就是“SAX Parser”)以一个串流解析器的型式作用,拥有API。由使用者定义,解析时,若发生事件的话会被调用。SAX事件包括:
XML 文字 节点
XML 元素 节点
XML 处理指令
&username&谢成志&/username&
&password&6626310xie&/password&
&sex&男&/sex&
&birthday&&/birthday&
&pictitle&ermao&/pictitle&
&picurl&images/head1.jpg&/picurl&
&/headpic&
此为下面即将解析度简单xml结构,并将其封装成一个User对象。
////////////////////////////////////////////////////////////////////////////////////
package com.xcz.
import java.io.F
import java.io.IOE
import javax.xml.parsers.ParserConfigurationE
import javax.xml.parsers.SAXP
import javax.xml.parsers.SAXParserF
import org.xml.sax.SAXE
import com.xcz.util.SaxU
public class Sax4XML {
public static void main(String[] args) {
//1.获取factory
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.获取parser
SAXParser parser = factory.newSAXParser();
//3.获取解析时的监听器对象
SaxUtil su = new SaxUtil();
//4.开始解析
parser.parse(new File("src/user-params.xml"), su);
System.out.println(su.getUser());
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
////////////////////////////////////////////////////////////////////////////////////
package com.xcz.
import java.text.ParseE
import java.text.SimpleDateF
import org.xml.sax.A
import org.xml.sax.SAXE
import org.xml.sax.helpers.DefaultH
import com.xcz.po.HeadP
import com.xcz.po.U
* 定义xml解析时的监听类
* 实现方式有很多,可以实现接口:ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler
* 但我们常用的继承:DefaultHandler
public class SaxUtil extends DefaultHandler {
private HeadPic headP
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
public void characters(char[] ch, int start, int length)
throws SAXException {
content = new String(ch, start, length);
//当解析到文本开始时触发
public void startDocument() throws SAXException {
super.startDocument();
//当解析到文本结束时触发
public void endDocument() throws SAXException {
super.endDocument();
//当解析到元素开始时触发
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException
if("user".equals(name))
user = new User();
if("headpic".equals(name))
headPic = new HeadPic();
//当解析到元素结束时触发
public void endElement(String uri, String localName, String name)
throws SAXException
if("username".equals(name))
user.setUsername(content);
if("password".equals(name))
user.setPassword(content);
if("sex".equals(name))
user.setSex(content);
if("birthday".equals(name))
user.setBirthday(sdf.parse(content));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if("pictitle".equals(name))
headPic.setPicTitle(content);
if("picurl".equals(name))
headPic.setPicUrl(content);
user.setHeadPic(headPic);
public User getUser(){
(1).节约内存开销
SAX解析器在某些方面优于DOM风格解析器,因为SAX解析器的使用量一般远低于DOM解析器使用量。DOM解析器在任何处理开始之前,必须将xml以整棵树放在内存,所以DOM解析器的内存使用量完全根据输入资料的大小。相对来说,SAX解析器的内存内容,是只基于XML档案的最大深度(XML树的最大深度)和单一XML项目上XML属性储存的最大资料。
(2)解析速度快
因为SAX事件驱动的本质,处理文件通常会比DOM风格的解析器快。
SAX事件驱动的模型对于XML解析很有用,但它确实有某些缺点。
某些种类的需要存取整份文件。例如,一个 IDREF属性需要文件内有项目使用指定字串当成DTD ID属性。要在SAX解析器内验证,必须追踪每个之前遇过的ID和IDREF属性,检查是否有任何相符。更甚者,一个IDREF找不到对应的ID,使用者只会在整份文件都解析完后才发现,若这种连结对于建立有效输出是重要的,那用在处理整份文件的时间只是浪费。
另外,某些XML处理仅要求存取整份文件。举例来说,及需要能够任何时间存取任何解析过的XML树。当SAX以用来建构此树时,DOM解析器在设计上已经是如此了。
浏览 10407
浏览: 23629 次
来自: 西安XML DOM 教程
XML DOM 节点信息
nodeName、nodeValue 和 nodeType 属性包含有关节点的信息。
尝试一下 - 实例
下面的实例使用 XML 文件
函数 ,位于外部 JavaScript 中,用于加载 XML 文件。
本例使用 nodeName 属性来获取 "books.xml" 中根元素的节点名称。
本例使用 nodeValue 属性来获取 "books.xml" 中第一个 &title& 元素的文本。
本例使用 nodeValue 属性来更改 "books.xml" 中第一个 &title& 元素的文本。
本例使用 nodeName 和 nodeType 属性来获取 "books.xml" 中根元素的节点名称和类型。
节点的属性
在 XML DOM 中,每个节点都是一个对象。
对象拥有方法和属性,并可通过 JavaScript 进行访问和操作。
三个重要的节点属性是:
nodeName 属性
nodeName 属性规定节点的名称。
nodeName 是只读的
元素节点的 nodeName 与标签名相同
属性节点的 nodeName 是属性的名称
文本节点的 nodeName 永远是 #text
文档节点的 nodeName 永远是 #document
nodeValue 属性
nodeValue 属性规定节点的值。
元素节点的 nodeValue 是 undefined
文本节点的 nodeValue 是文本本身
属性节点的 nodeValue 是属性的值
获取元素的值
下面的代码检索第一个 &title& 元素的文本节点的值:
xmlDoc=loadXMLDoc(&books.xml&);
x=xmlDoc.getElementsByTagName(&title&)[0].childNodes[0];
txt=x.nodeValue;
结果:txt = "Everyday Italian"
实例解释:
把 "" 载入 xmlDoc 中
获取第一个 &title& 元素节点的文本节点
把 txt 变量设置为文本节点的值
更改元素的值
下面的代码更改第一个 &title& 元素的文本节点的值:
xmlDoc=loadXMLDoc(&books.xml&);
x=xmlDoc.getElementsByTagName(&title&)[0].childNodes[0];
x.nodeValue=&Easy Cooking&;
实例解释:
把 "" 载入 xmlDoc 中
获取第一个 &title& 元素节点的文本节点
更改文本节点的值为 "Easy Cooking"
nodeType 属性
nodeType 属性规定节点的类型。
nodeType 是只读的。
最重要的节点类型是:
反馈内容(*必填)
截图标记颜色
联系方式(邮箱)
联系邮箱:
投稿页面:
记住登录状态
重复输入密码下次自动登录
现在的位置:
& 综合 & 正文
jdom和dom4j解析xml注释拿到注释下的节点
xml 所有元素都是节点,其中包括元素节点,值得注意的是不是所有节点都是元素节点(Element)所以类型转换的时候要
注意,是我们常用的,还有文档节点,在解析到文档节点 时,解析文件的DTD元素这样就会在解析的时候等一段时间,也可
以跳过不去解析下面找到了一个方法。
import java.io.StringBufferInputS
import org.xml.sax.EntityR
import org.xml.sax.InputS
* 跳过解析文件的DTD元素时用
* @author RAQ
public class NoOpEntityResolver implements EntityResolver {
public InputSource resolveEntity(String publicId, String systemId){
return new InputSource(new StringBufferInputStream(""));
下面是操作xml类:
import java.io.F
import java.io.FileNotFoundE
import java.io.FileOutputS
import java.io.IOE
import java.util.ArrayL
import java.util.L
import org.jdom.C
import org.jdom.DocT
import org.jdom.D
import org.jdom.E
import org.jdom.JDOME
import org.jdom.input.SAXB
import org.jdom.output.F
import org.jdom.output.XMLO
import org.xml.sax.EntityR
public class Test {
* 解析xml得到Document对象
* @param path
public static Document loadXML(String path){
File file = new File(path);
SAXBuilder sax = new SAXBuilder();
sax.setEntityResolver(new NoOpEntityResolver());//不解析文件的DTD元素(文档说明部分)
Document doc =
doc = sax.build(file);
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
* 解析注释获得注释下面的节点
* @param doc
public static List&Content& getContentList(Document doc){
List&Content& integrationList = new ArrayList&Content&();
Element root = doc.getRootElement();
List&Content& childList = root.getContent();
for(int i = 0;i&childList.size();i++){
if((i+2)&childList.size()&&"integration".equals(childList.get(i).getValue().trim())){//判断是不是注释
integrationList.add(childList.get(i+2));//Element e = (Element)childList.get(i+2);可以强转成Element但是取到的是元素节点才可以强转
i = i + 2;
return integrationL
* 把解析到的节点再存到xml
* @param integrationList
* @param generatePath
public static void writeXML(List&Content& integrationList,String generatePath){
File outFile = new File(generatePath);
Document doc =
Element root =
DocType dt = new DocType("web-app","-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN","/dtd/web-app_2_3.dtd");
//这里是web.xml的文档说明
if(outFile.exists()){
doc = loadXML(generatePath);
root = doc.getRootElement();
if(doc.getDocType()==null)
doc.setDocType(dt);
for(int i = 0;i&integrationList.size();i++){
root.addContent(integrationList.get(i).detach());//要去点原来的父节点
root = new Element("web-app");
for(int i = 0;i&integrationList.size();i++){
root.addContent(integrationList.get(i).detach());
doc.setDocType(dt);
doc = new Document(root);
XMLOutputter out = new XMLOutputter();
out.setFormat(Format.getPrettyFormat().setEncoding("utf-8"));
String xmlStr=out.outputString(doc);
System.out.println(xmlStr);
FileOutputStream fos =
fos = new FileOutputStream(outFile,false);
out.output(doc,fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
fos.close();
} catch (IOException e) {
e.printStackTrace();
public static void main(String[] args) {//测试
String path = "G:\\merge\\test.xml";
String generatePath = "G:/testweb.xml";
List&Content& integrationList = getContentList(loadXML(path));
writeXML(integrationList,generatePath);
以上是jdom解析xml注释内容。
下面是dom4j解析注释的部分,不全,
import java.util.ArrayL
import java.util.I
import java.util.L
import org.dom4j.D
import org.dom4j.DocumentE
import org.dom4j.E
import org.dom4j.N
import org.dom4j.io.SAXR
public class Dom4jTest {
* @param args
public static void main(String[] args) {
List&Element& list = new ArrayList&Element&();
//File file = new File();
SAXReader sax = new SAXReader();
Document doc = sax.read("G:/merge/test.xml");
Element root = doc.getRootElement();
for (Iterator&Node& nodeIterator =root.nodeIterator(); nodeIterator.hasNext();) {
Node node = nodeIterator.next();
if(node.getNodeType()==MENT_NODE&&"integration".equals(node.getText())){
Element nodeNext = (Element)nodeIterator.next();
list.add(nodeNext);
} catch (DocumentException e) {
e.printStackTrace();
for(Element ele:list){
for (Iterator&Element& eleIterator =ele.elementIterator(); eleIterator.hasNext();) {
Element child = eleIterator.next();
System.out.println(child.getName()+"\t"+child.getTextTrim());
应该是类似的,自己总结下下次遇到就不用百度谷歌了。
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 xml获取指定节点 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信