用Stax方式处理xml
1.读取xml文件,首先用类加载器加载项目目录下的xml文件,从XMLInputFactory创建我所需要的XMLStreamReader,即得到了xml文件。根据XMLStreamConstant
属性值,就可以操作所得到的xml文件内容,详情看以下代码。
public class TestStax {
public static void main(String[] args) {
//基于光标式的
// new TestStax().baseStax();
// new TestStax().baseStax_01();
//基于迭代模型的
// new TestStax().baseStax_02();
//基于过滤器的
new TestStax().baseStax_03();
}
public void baseStax(){
XMLInputFactory xif = XMLInputFactory.newInstance();
InputStream is = null;
XMLStreamReader xsr = null;
try {
//第一种加载文件方式,此文件在根目录下
is = TestStax.class.getClassLoader().getResourceAsStream("menu.xml");
xsr = xif.createXMLStreamReader(is);
while(xsr.hasNext()){
int type = xsr.next();
System.out.println(type);
if(type == XMLStreamConstants.START_ELEMENT){
System.out.println(xsr.getName());
}else if(type == XMLStreamConstants.CHARACTERS){
System.out.println(xsr.getText().trim());
}else if(type == XMLStreamConstants.END_ELEMENT){
System.out.println("/" + xsr.getName());
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void baseStax_01(){
XMLInputFactory xif = XMLInputFactory.newInstance();
InputStream is = null;
XMLStreamReader xmlsr = null;
try {
//另一种加载文件方式
is = new FileInputStream(System.getProperty("java.class.path") + File.separator + "menu.xml");
xmlsr = xif.createXMLStreamReader(is);
while(xmlsr.hasNext()){
int type = xmlsr.next();
//XMLStreamConstants.START_ELEMENT=1
if(type == 1){
if("name".equals(xmlsr.getName().toString())){
System.out.print(xmlsr.getElementText() + ":");
}else if("price".equals(xmlsr.getName().toString())){
System.out.println(xmlsr.getElementText());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void baseStax_02(){
XMLInputFactory xif = XMLInputFactory.newInstance();
InputStream is = null;
is = TestStax.class.getClassLoader().getResourceAsStream("menu.xml");
try {
XMLEventReader xmler = xif.createXMLEventReader(is);
while(xmler.hasNext()){
XMLEvent xmle = xmler.nextEvent();
if(xmle.isStartElement()){
String name = xmle.asStartElement().getName().toString();
if("name".equals(name)){
System.out.print(xmler.getElementText() + ":");
}else if("price".equals(name)){
System.out.println(xmler.getElementText());
}
}
}
} catch (XMLStreamException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void baseStax_03(){
XMLInputFactory xif = XMLInputFactory.newFactory();
InputStream is = TestStax.class.getClassLoader().getResourceAsStream("menu.xml");
XMLEventReader xmler = null;
try {
xmler = xif.createFilteredReader(xif.createXMLEventReader(is), new EventFilter() {
@Override
public boolean accept(XMLEvent event) {
if(event.isStartElement()){
String name = event.asStartElement().getName().toString();
if("name".equals(name) || "price".equals(name)){
return true;
}
}
return false;
}
} );
} catch (XMLStreamException e) {
e.printStackTrace();
}
while(xmler.hasNext()){
try {
XMLEvent xmle = xmler.nextEvent();
if(xmle.isStartElement()){
String nm = xmle.asStartElement().getName().toString();
if("name".equals(nm)){
System.out.print(xmler.getElementText() + ":");
}else if("price".equals(nm)){
System.out.println(xmler.getElementText());
}
}
} catch (XMLStreamException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
下面是我说是用的xml,在w3cSchool里弄的xml文件,也可以自己建一个xml文件
<?xml version="1.0" encoding="UTF-8"?> <breakfast_menu>
<food ceshi="test">
<name>Belgian Waffles</name>
<price>$5.95</price>
<description>two of our famous Belgian Waffles with plenty of real maple syrup</description>
<calories>650</calories>
</food>
<food ceshi="test">
<name>Strawberry Belgian Waffles</name>
<price>$7.95</price>
<description>light Belgian waffles covered with strawberries and whipped cream</description>
<calories>900</calories>
</food>
<food>
<name>Berry-Berry Belgian Waffles</name>
<price>$8.95</price>
<description>light Belgian waffles covered with an assortment of fresh berries and whipped cream</description>
<calories>900</calories>
</food>
<food>
<name>French Toast</name>
<price>$4.50</price>
<description>thick slices made from our homemade sourdough bread</description>
<calories>600</calories>
</food>
<food>
<name>Homestyle Breakfast</name>
<price>$6.95</price>
<description>two eggs, bacon or sausage, toast, and our ever-popular hash browns</description>
<calories>950</calories>
</food>
</breakfast_menu>
3.基于Xpath处理xml
//基于Xpath
public void baseStax_04(){
InputStream is = null;
is = TestStax.class.getClassLoader().getResourceAsStream("menu.xml");
XPathFactory xpf = XPathFactory.newInstance();
XPath xp = xpf.newXPath();
try {
//创建文档对象
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
//创建文档
Document doc = db.parse(is);
NodeList nl = (NodeList)xp.evaluate("//food[@ceshi='test']", doc,XPathConstants.NODESET);
// for(int i=0;i<nl.getLength();i++){
// Element ele = (Element)nl.item(i);
// String value = ele.getElementsByTagName("name").item(0).getTextContent();
// System.out.println(value);
// }
//当不把node转化为element时
for(int j=0;j<nl.getLength();j++){
NodeList nodelist = nl.item(j).getChildNodes();
for(int p=0;p<nodelist.getLength();p++){
Node nodechild = nodelist.item(p);
if(nodechild.getNodeName() != "#text"){
System.out.println(nodechild.getNodeName() + ":" + nodechild.getTextContent());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
4.修改xml,用XPath计算得到查找的位置,修改后用Transformer进行替换原文件
public void update_xml(){
XPath xpath = XPathFactory.newInstance().newXPath();
InputStream is = TestStax.class.getClassLoader().getResourceAsStream("menu.xml");
Document doc= null;
try {
doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
NodeList nodelist = (NodeList)xpath.evaluate("//food[name='Belgian']", doc,XPathConstants.NODESET );
Element element = (Element)nodelist.item(0);
Element ele = (Element)element.getElementsByTagName("price").item(0);
System.out.println(ele.getTextContent());
ele.setTextContent("12121");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
Result result = new StreamResult(System.out);
transformer.transform(new DOMSource(doc), result);
} catch (Exception e) {
e.printStackTrace();
}
}
5.以XMLStreamWriter的方式写入xml
public void writeXml(){
try {
XMLStreamWriter xmlsw = XMLOutputFactory.newFactory().createXMLStreamWriter(System.out);
xmlsw.writeStartDocument("UTF-8", "1.0");
xmlsw.writeEndDocument();
String ns = "http://xiaoqiaolv";
xmlsw.writeStartElement("ns","student",ns);
xmlsw.writeStartElement("name");
xmlsw.writeAttribute("realname","zhangsan");
xmlsw.writeCharacters("text");
xmlsw.writeEndElement();
xmlsw.writeEndElement();
xmlsw.flush();
xmlsw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
用Stax方式处理xml的更多相关文章
- spring aop注解方式与xml方式配置
注解方式 applicationContext.xml 加入下面配置 <!--Spring Aop 启用自动代理注解 --> <aop:aspectj-autoproxy proxy ...
- iOS 应用数据存储方式(XML属性列表-plist)
iOS 应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) ...
- iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)
iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存 ...
- Android网络之数据解析----SAX方式解析XML数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- 用JAXP的dom方式解析XML文件
用JAXP的dom方式解析XML文件,实现增删改查操作 dom方式解析XML原理 XML文件 <?xml version="1.0" encoding="UTF-8 ...
- Dom方式解析XML
public class TestXML { public static void main(String[] args) throws SAXException, IOException { //D ...
- (四)SAX方式解析XML数据
SAX方式解析XML数据 文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程 ...
- PHP 以POST方式提交XML、获取XML,最后解析XML
以POST方式提交XML // Do a POST $data="<?xml version='1.0' encoding='UTF-8'?> <TypeRsp> & ...
- Struts2第十篇【数据校验、代码方式、XML配置方式、错误信息返回样式】
回顾以前的数据校验 使用一个FormBean对象来封装着web端来过来的数据 维护一个Map集合保存着错误信息-对各个字段进行逻辑判断 //表单提交过来的数据全都是String类型的,birthday ...
随机推荐
- C# 6 与 .NET Core 1.0 高级编程 - 37 章 ADO.NET
译文,个人原创,转载请注明出处,有不对的地方欢迎指出与交流. 英文原文:Professional C# 6 and .NET Core 1.0 - 37 ADO.NET --------------- ...
- HTML5 技术在风电、光伏等新能源领域的应用
随着新一轮工业革命兴起,应对气候变化日益成为全球共识,能源技术正在成为引领能源产业变革.实现创新驱动发展的源动力.从全球到中国,以风能.光伏发电为代表的新能源产业发展迅速,可再生能源发电与现代电网的融 ...
- spring和UEditor结合
前言 春节无聊,就去弄一下富文本编辑器,然后百度了一番,很多说百度的UEditor不错,然后去官网照着文档弄一遍,是挺简单好用的.然后想把这玩意结合到自己的一个spring项目里面,果然还是在点上传图 ...
- Java Web(三) 会话机制,Cookie和Session详解
很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...
- ArcGIS许可启动问题
前段时间,由于360常常删除重要文件终于发生在我身上.不得已换了电脑管家,清理后再次打开License Server Administrator时,发现启动项怎么也点不动了.而打开服务管理器,却发现A ...
- 如何用js实现自适应,原来只是几行代码的事(╯‵□′)╯︵┻━┻
在javascript写下如下几行: (function (doc, win, undefined) { var docEl = doc.documentElement, ...
- HTTP基础知识(一)
一.了解web及网络基础 1.通过发送请求获取服务器资源的web浏览器等的都可称为客户端(client) 2.HTTP:HyperText Transfer Protocol,超文本传输协议:所有的W ...
- linux 下maven安装
版本要求maven3.2.3 软件下载 wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.2.3/binaries/apache-maven-3 ...
- unity3d教程-01-安装及使用Unity
我们前往unity官网:https://unity3d.com/cn/ 选择下载个人版,免费使用,功能齐全,就是在应用启动时有unity的动画 支持正版从我做起 整个安装过程需要网络的支持 下载安装程 ...
- mac上搭建appium环境过程以及遇到的问题
Mac环境安装appium 一.Java环境 下载java sdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downl ...