在最近的一个项目,经常需要读取XML进行预处理,将处理后内容写入中间文件(xml),
现在出现的一个问题是,某些中间文件,在JDOM载入进行build时,报出如下错误:
Error: Error on line 1 of document file:/C:/eclipse/workspace/Cmd/deleteme1.xml: Content is not
allowed in prolog.
打开此文件,发现其第一行内容为:
<?xml version="1.0" encoding="UTF-8"?>
通过UltraEdit查看其16进制,发现前面3个字符(6个字节)为:
C3 AF C2 BB C2 BF;
查看原文件,开头含有两字节FF FE;对比其他文件并不含。
此处需要插入BOM头的内容:
引用
UTF的字节序和BOM
UTF -8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如 “
奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是 “乙”?
Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想
法:
在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传
输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。
这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH
NO-BREAK SPACE"又被称作BOM。
UTF -8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是 EF BB BF(读者可以
用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
Windows就是使用BOM来标记文本文件的编码方式的。
请参考:
谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
现在发现就是出错文件含有BOM头,而在读取时并没有使用相应encoding,
BufferedReader br = new BufferedReader(new FileReader(oldFile));
这样读取使用的话,应该是使用的eclipse默认编码(与当前Java文件编码相同?),还没想明白。
解决办法如下:
BufferedReader br = new BufferedReader(new FileReader(oldFile));
br.mark(10);
int b1,b2,b3;
String readEncoding = defaultReadEncoding;
b1 = br.read();
b2 = br.read();
b3 = br.read();
if(b1==0xef && b2==0xbb && b3==0xbf){
readEncoding = "UTF8";
}else if(b1== 0xfe && b2==0xff){
readEncoding = "UnicodeBig";
}else if(b1== 0xff && b2==0xfe){
readEncoding = "UnicodeLittle";
}
if(readEncoding==null){
br.reset();
}else{
br.close();
FileInputStream fis = new FileInputStream(oldFile);
InputStreamReader isr = new InputStreamReader(fis, readEncoding);
br = new BufferedReader(isr);
}
而在写入时,使用代码
FileOutputStream fos = new FileOutputStream(newFile);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, "UTF8"));
这是没有问题的,前面出现问题是因为使用了错误的编码读取了6个错误字节而在写入前已经出现错误。
还有些东西、点没想通,再补充。
分享到:
相关推荐
该模块的核心功能是通过对象操作方式来解析XML文档,这种方式使得开发者可以更直观地理解XML结构,并能方便地访问和修改XML文档中的各个元素。在易语言中,对象通常代表一个具体的实体,通过对象的方法和属性,可以...
1. 编译器:读入 DTD 或者 XML Schema,生成相等结构的 Java Object Model。 2. 操作 API:提供了统一的基本操作(如 marshalling,unmarshalling),隐藏了 JAXB 内部操作的实现代码。 JAXB 的基本操作 -----------...
2. **解析XML数据**:利用“XML解析”命令解析XML文档,将其转换为易语言内部的数据结构,如数组或链表。这一步会涉及XPath或XQuery等查询语言,以便选取需要的数据节点。 3. **创建表格结构**:根据解析后的数据...
DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。 SAX解析XML,是基于事件通知的...
易语言源码易语言读入xml到高级表格源码.rar 易语言源码易语言读入xml到高级表格源码.rar 易语言源码易语言读入xml到高级表格源码.rar 易语言源码易语言读入xml到高级表格源码.rar 易语言源码易语言读入xml到...
在易语言中,我们可以使用内置的XML解析库来解析XML文档并获取其中的节点值。以下是一个基本的步骤: 1. **加载XML文档**:首先,我们需要将XML文件加载到内存中。这可以通过调用“创建XML文档”函数完成,传入XML...
在DOM解析XML时,整个XML文件会被读入内存,并构建一个树形结构,这在处理大文件时可能会导致内存溢出。而SAX解析器则采取不同的策略,它以事件的形式逐个处理XML元素,只在需要时存储少量信息,因此对于大文件来说...
功能:创建XML文件的根节点 参数:[in] sName 根节点的节点名 返回:true创建成功 false创建失败 **************************************/ bool CreateRootNode(CString sName); /************************...
在QT中,可以使用DOM方式解析XML文档,将XML文档读入内存,构建为DOM树,并通过节点遍历的方式实现数据的存取和操作。 在DOM方式中,XML文档中的每个成分都是一个节点。例如,整个文档对应一个文档节点;每个XML...
例如,分析`read_xml_file`函数的接口,可以理解它是如何解析XML结构并转化为Halcon对象的。 4. **应用场景**: - 配置文件:XML文件常被用来保存Halcon的配置参数,如相机设置、光源控制等,方便在不同环境中快速...
2. **解析XML结构**:读取XML文件后,需要解析其结构。XML文档由元素、属性、文本等构成,易语言需要逐层解析这些结构。可以使用递归函数或循环结构来遍历XML树,获取每个节点的信息。 3. **构建表格模型**:解析...
DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。 SAX解析XML,是基于事件通知的...
这是使用DOM解析XML的关键步骤,我们将XML文件读入一个`Document`对象: ``` File inputFile = new File("beans.xml"); Document doc = builder.parse(inputFile); ``` 6. **获取根元素**: 一旦解析完成,...
### 读入XML文件生成TreeView知识点详解 #### 一、背景与需求 在进行Flex项目的开发过程中,常常需要处理XML格式的数据。一个常见的任务就是将XML文件中的数据转化为可视化的TreeView结构,以便用户能直观地浏览和...
程序文件主要包括两部分功能:一是使用python自带的xml.etree.ElementTree类读入和解析xml树形信息文件;二是使用 PyQt5 的 QTreeWidget 构建树,并将信息展示到Tree 的对应节点Item上。 初次接触xml和QTreeWidget...
在Android开发中,"Pull解析xml"是一种常见的处理XML数据的方式。XML(eXtensible Markup Language)是一种用于标记数据的结构化语言,常用于网络数据交换和存储。本篇文章将深入探讨Android中的Pull解析机制以及...
l xmlread(), 用于读取XML文件内容,读入后的变量是一个Java XML object。 l xmlwrite(), 用于写入XML文件内容,同样输出变量也要是一个Java XML Object。 l xslt(),用于stylesheet转换的问题,所以就没有关系。 ...
解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析。 DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了。 优点:整个文档读入内存,...
- **原理**:DOM 解析器会将整个 XML 文档读入内存,并构建一个完整的树形结构(节点树)。这使得用户可以通过标准的 DOM 接口操作这个树结构,包括查询节点、修改节点等。 - **优点**: - 易于使用:提供了丰富的 ...
2 读入XML文件bookA.xml,加入一条处理指令,修改第一本书的价格和作者,并添加一条属性,然后写入文件bookB.xml 3 解析abc.xml文档,读取所有属性和子节点并输出 4 解析parse.xml文档,创建方法新增节点、根据ID...