package com.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
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 XMLParse {
public static void main(String[] args) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//解析器工厂
//读入xml
DocumentBuilder dombuilder=factory.newDocumentBuilder();
File file = new File("sth.xml");
InputStream is = new FileInputStream(file);
Document doc=dombuilder.parse(is);
Element root=doc.getDocumentElement();
NodeList books=root.getChildNodes();
for(int i=0;i<books.getLength();i++){
Node book=books.item(i);
String email=book.getAttributes().getNamedItem("email").getNodeValue();
System.out.println(email);
for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()){
if(node.getNodeType()==Node.ELEMENT_NODE){
if(node.getNodeName().equals("name")){
String name=node.getNodeValue();
String name1=node.getFirstChild().getNodeValue();
System.out.println(name);
System.out.println(name1);
}
if(node.getNodeName().equals("price")){
String price=node.getFirstChild().getNodeValue();
System.out.println(price);
}
}
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<books>
<book email="zhoujunhui">
<name>rjzjh</name>
<price>jjjjjj</price>
</book>
</books>
异常提示是Content is not allowed in prolog.意思就是说文件开头的时候有问题。。。我E文不好不能解释的“信,雅,达”,见谅,呵呵。还是跟我为了Spring而换上的xerces有关。。。狂晕,google了一番发现是一个叫BOM的东西搞的鬼,而xerces确实有BOM的问题,在Apache的论坛里看到一个帖子也提到xerces的BOM问题(可是借助灵格斯 一个单词一个单词翻译的看的。。。,顺便吐血推荐“灵格斯”,一款比金山词霸好用X倍速度快Y倍资源占用少Z倍的免费软件,注意是无插件,无广告,完全免费!!!金山现在为了反D版,所有装了D版金山的XP老是无缘无故死机,大家应该都很郁闷吧。被我推荐用灵格斯的人都说好,群众的眼睛是雪亮的啊。支持面向个人用户的软件免费!靠好质量好服务赚钱才是王道!!!),回帖是说换掉xerces用其他解析器,可是我不能换,换了Spring还指望它呢,我也不知道换成什么比它更好。。。,还有的说给xerces的如果是stream就可以接受BOM,如果是reader就不行(我默认大家都对JAVA的IO有一定了解能够理解stream和reader啊),难道我跑去把iBATIS里的源代码改了,然后重新编译???这样也不好吧,总有简单点的方式解决吧。
于是继续google,随着对BOM进一步的了解发现把SqlMap文件里的BOM给删除调应该是最快最方便的方式,因为BOM在UTF-8里面并不起什么作用,本来是可有可无的。下面先让大家对BOM有个大概的认识(细节可以参考官方网站 ),然后告诉大家怎么样快捷的删掉文件里的BOM。
我们这里提到的BOM并不是制造业管理中料表(Bill of Material)的概念,而是UCS(Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS)编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian(big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。还是将49写在前面,就是little endian。我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。)的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。
UTF-8是以8位为单位来表示UCS,其实不存在什么尾序的问题,其实BOM是没有什么作用的,不过可以用BOM来表示编码方式,字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF,所以如果接受到以EF BB BF开头的字节流就可以判断是UTF-8编码了。
如果上面提到的一些名词你不是很清楚可以google一下,找到相关的解释。追根究底是个好习惯?。如果对BOM的概念还不清楚或者想了解更多也可以搜索相关资料来研究。
下面重点来说一下怎么去掉BOM:
首先windows自带的记事本会在保存UTF-8编码的文件时不管是否含有BOM一律加上BOM,所以千万别用记事本。我的程序跑不起来也是因为用记事本打开过。。。有段时间非常流行的“联通”问题就是跟windows记事本处理BOM的机制有关,就是把“联通”两字写进记事本保存后再打开时就会是黑点。。。如果你有兴趣可以到网上找到相关文章详细解释给你听,呵呵。
比较新版本的UltraEdit(以下简称UE,大家都是这么叫的)都对BOM支持比较好,所以推荐使用新版本的UE来解决这个问题。我用的版本是UltraEdit-32 10.20d+中文版(网上可以下的到,如果你比较懒可以联系我,留下邮箱,呵呵)。首先打开UE,选择菜单栏“高级”-“配置”,出现一个选项卡窗口,在“常规”选项卡中找到“保存时对所有UTF-8文件头标记(BOM)”和“对在UltraEdit里创建的新文件写入UTF-8文件头标记(如上面)”,把它们的复选框都取消不选,然后确定。这个时候UE默认情况下就不会对没有BOM的文件加入BOM,注意如果不执行上述操作UE默认也是会加的!那已经含有BOM的文件如何清除BOM呢?下面演示给大家。首先打开文件,选择菜单栏“文件”-“格式转换”-“UTF-8 转 ASCII”,这样文件会被转为ASCII编码,BOM就不会存在了,因为上面说过BOM是在UCS编码的头部的,然后再选择菜单栏“文件”-“格式转换”-“ASCII 转 UTF-8(Unicode编辑)”,这个时候文件会被转回为UTF-8编码,因为我们上面选了不自动加BOM,所以这个时候的文件是不带BOM的,然后保存文件。整个操作过程就完毕了。(如果仍然有什么疑问给我留言吧)
我去掉BOM后重新启动服务器,访问数据库一切正常,问题果然解决了。当然在我碰到的这个问题中干脆把文件转成ASCII直接用也可以,汗!不知道为什么,请大家指教!
分享到:
相关推荐
易语言 xml解析 易语言 xml解析 易语言 xml解析 易语言 xml解析 易语言 xml解析 易语言 xml解析 易语言 xml解析 教程 带源码
解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,...
C# XML解析方式
XML解析、XML生成工具,灵活好用的XML解析器、封装接口简单易用
XML解析技术研究XML解析技术研究XML解析技术研究XML解析技术研究XML解析技术研究
使用dom4j解析XML,用于解析复杂XML,多层镶嵌XML,多层循环xml解析,解析完保存到实体类
LabVIEW XML解析器示例, 包含xml加载,保存,解析等功能
minixml是适合嵌入式系统的xml解析器,支持dom
ios开发,简单的xml解析,亲测可用,自己认真研究研究,不要遇到点问题就放弃。
利用jdom解析复杂xml到bean中: 1.依赖的jar:jdom-1.1.jar,commons-beanutils.1.8.3.jar,commons-logging-1.1.1.jar ...用模板将xml解析 具体可以打断点运行主类:/xml_parse/src/com/vhl/main/StartMain.java,观察
Mini-XML 是一个小型 XML 解析库,您可以使用它来读取应用程序中的 XML 数据文件或字符串,而无需大型非标准库 读取 UTF-8 和 UTF-16 并写入 UTF-8 编码的 XML 文件和字符串。 数据存储在链表树结构中,保留 XML ...
java心电图xml解析源码。
XML 解析XML 解析XML 解析XML 解析XML 解析XML 解析XML 解析
java实现xml解析word文档代码实现,通过解析word书签实现java动态写入word文档。方便使用。
XML解析 很全 一看就懂的东东。。。。。。。。。
rss阅读器与 XML解析 XML RSS 阅读器 Winfom ASP.NET rss阅读器与 XML解析 XML RSS 阅读器 Winfom ASP.NET rss阅读器与 XML解析 XML RSS 阅读器 Winfom ASP.NET rss阅读器与 XML解析 XML RSS 阅读器 Winfom ASP.NET ...
XML解析支持库
C++ XML解析之TinyXML篇
tinyxml解析XML文件