java中XML的用法总结

附加new.xml文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<language>
	<lan id="1">
		<name>Java</name>
		<ide>Eclipse</ide>
	</lan>
	<lan id="2">
		<name>Swift</name>
		<ide>XCode</ide>
	</lan>
	<lan id="3">
		<name>C#</name>
		<ide>Visual Studio</ide>
	</lan>
</language>


第一创建.xml文件

import java.io.File;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;


public class CreateXML {

	public static void main(String[] args) {
		DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		DocumentBuilder builder=null;
		try {
			builder = factory.newDocumentBuilder();
			Document document=builder.newDocument();
			Element root=document.createElement("language");
			
			Element lan1=document.createElement("lan");
			lan1.setAttribute("id","1");
			Element name1=document.createElement("name");
			name1.setTextContent("Java");
			Element ide1=document.createElement("ide");
			ide1.setTextContent("Eclipse");			
			lan1.appendChild(name1);
			lan1.appendChild(ide1);
			root.appendChild(lan1);
			
			Element lan2=document.createElement("lan");
			lan2.setAttribute("id","2");
			Element name2=document.createElement("name");
			name2.setTextContent("Swift");
			Element ide2=document.createElement("ide");
			ide2.setTextContent("XCode");		
			lan2.appendChild(name2);
			lan2.appendChild(ide2);
			root.appendChild(lan2);			
			
			Element lan3=document.createElement("lan");
			lan3.setAttribute("id","3");
			Element name3=document.createElement("name");
			name3.setTextContent("C#");
			Element ide3=document.createElement("ide");
			ide3.setTextContent("Visual Studio");		
			lan3.appendChild(name3);
			lan3.appendChild(ide3);
			root.appendChild(lan3);		
			
			document.appendChild(root);
			
			TransformerFactory tf=TransformerFactory.newInstance();
			Transformer t=tf.newTransformer();
//			StringWriter sw=new StringWriter();
			t.transform(new DOMSource(document),  new StreamResult(new File("newXML.xml")));
//			System.out.print(sw);
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

除了生成文件外,还可以直接打印在控制台。

只需把

 new StreamResult(new File("newXML.xml"))  

改为

StringWriter sw=new StringWriter();
t.transform(new DOMSource(document),  new StreamResult(sw));
System.out.print(sw);

然后就是读取.xml文件中的内容 。

import java.io.File;
import java.io.IOException;

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.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class CreateXML 
{
	public static void main(String[] args) 
	{
		try {
			DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
			DocumentBuilder db=dbf.newDocumentBuilder();
			Document d=db.parse(new File("newXML.xml"));
			Element root=d.getDocumentElement();
			System.out.println(root.getNodeName());
			NodeList list=root.getElementsByTagName("lan");
			for(int  n=0;n<list.getLength();++n)
			{
				Element no=	(Element) list.item(n);
				System.out.println(no.getTagName()+" "+"id="+no.getAttribute("id"));
				NodeList li=no.getChildNodes();
				for(int va=0;va<li.getLength();++va)
				{
					Node ele= li.item(va);
					if(ele instanceof Element)
					System.out.println(ele.getNodeName()+" "+ele.getTextContent());
				}
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
	}

}


这里是读取出来,并且打印在控制台上。

然后就是,利用外部工具dom4j来打印

		String xml="<lang><peo>Jerry</peo></lang>";
		
		Document dom;
		try {
			dom = DocumentHelper.parseText(xml);
			System.out.println(dom.asXML());		
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
dom4j更多的用法希望读者自行解压dom4j安装包后,打开docs/index.html自行查阅。

还有就是通过XPath来定位信息,简化很多操作,不需要一层层遍历下去。

核心代码:(这个可以直接模仿的)

		XPathFactory xpf=XPathFactory.newInstance();
		XPath   xp=	xpf.newXPath();
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();			
			DocumentBuilder db=dbf.newDocumentBuilder();
			org.w3c.dom.Document d=db.parse(new File("newXML.xml"));
			System.out.println(xp.evaluate("/language/lan2/name", d));
			
这里所使用的newXML.xml文件已经被我稍作更改:(目的就是为了直接定位Swift,把lan改为lan2)

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<language>
	<lan id="1">
		<name>Java</name>
		<ide>Eclipse</ide>
	</lan>
	<lan2 id="2">
		<name>Swift</name>
		<ide>XCode</ide>
	</lan2>
	<lan id="3">
		<name>C#</name>
		<ide>Visual Studio</ide>
	</lan>
</language>
这里需要注意的是:若有多个相同的标签,比如lan,定位的结果是第一个标签。
而你若是真心想要找到这些全部相同的标签,可以试试这个方法:
		XPathFactory xpf=XPathFactory.newInstance();
		XPath   xp=	xpf.newXPath();
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();			
			DocumentBuilder db=dbf.newDocumentBuilder();
			org.w3c.dom.Document d=db.parse(new File("newXML.xml"));
			NodeList nodes=(NodeList) xp.evaluate("/language/lan/name", d,XPathConstants.NODESET);
			for(int k=0;k<nodes.getLength();++k)
			{
				System.out.println(nodes.item(k).getTextContent());
			}

返回了一个NodeList,然后就直接遍历。

在此基础上,还想更加简单,还有个地方可以优化:

			System.out.println(xp.evaluate("//lan2/name", d));
表示从整个xml文档中查找,而不考虑当前节点位置。

XPath中的符号说明:

符号

说明

示例

示例说明

/

表示从根节点开始选择

/pets

选择根节点pets

表示节点和子节点之间的间隔符

/pets/dog

选择pets节点下的dog节点

//xx

表示从整个xml文档中查找,而不考虑当前节点位置

//price

选择文档中所有的price节点

.

单个英文半角句点表示选择当前节点

/pets/.

选择pets节点

..

双点,表示选择父节点

/pets/dog[0]/..

表示pets节点,也就是第一个dog节点的父节点

@xx

表示选择属性

//dog/@color

表示选择所有dog节点的color属性集合

[…]

中括号表示选择条件,括号内为条件

//dog[@color=’white’]

所有color为white的dog节点

//dog[/price<100]

所有price字节点值小于100的dog节点

中括号内数字为节点索引,类似c#等语言中的数组,数组下标是从1开始的

//dog[1]

第1个dog节点

//dog[last()]

最后一个dog节点,last()是xPath内置函数

|

单竖杠表示合并节点结合

//dog[@color=’white’] | //cat[@color=’white’]

color属性为white的dog节点和color属性为white的cat节点

*

星号表示任何名字的节点或者属性

//dog/*

表示dog节点的所有子节点

//dog/@*

表示dog节点的所有属性节点





  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值