`
andy54321
  • 浏览: 441340 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

分类读入、解析XML

    博客分类:
  • J2EE
阅读更多
在最近的一个项目,经常需要读取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结构,并能方便地访问和修改XML文档中的各个元素。在易语言中,对象通常代表一个具体的实体,通过对象的方法和属性,可以...

    jaxb解析xml

    1. 编译器:读入 DTD 或者 XML Schema,生成相等结构的 Java Object Model。 2. 操作 API:提供了统一的基本操作(如 marshalling,unmarshalling),隐藏了 JAXB 内部操作的实现代码。 JAXB 的基本操作 -----------...

    易语言读入xml到高级表格

    2. **解析XML数据**:利用“XML解析”命令解析XML文档,将其转换为易语言内部的数据结构,如数组或链表。这一步会涉及XPath或XQuery等查询语言,以便选取需要的数据节点。 3. **创建表格结构**:根据解析后的数据...

    xml解析新浪新闻_客户端

    DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。 SAX解析XML,是基于事件通知的...

    易语言源码易语言读入xml到高级表格源码.rar

    易语言源码易语言读入xml到高级表格源码.rar 易语言源码易语言读入xml到高级表格源码.rar 易语言源码易语言读入xml到高级表格源码.rar 易语言源码易语言读入xml到高级表格源码.rar 易语言源码易语言读入xml到...

    易语言读入xml数据节点值

    在易语言中,我们可以使用内置的XML解析库来解析XML文档并获取其中的节点值。以下是一个基本的步骤: 1. **加载XML文档**:首先,我们需要将XML文件加载到内存中。这可以通过调用“创建XML文档”函数完成,传入XML...

    dom4j下的sax解析xml

    在DOM解析XML时,整个XML文件会被读入内存,并构建一个树形结构,这在处理大文件时可能会导致内存溢出。而SAX解析器则采取不同的策略,它以事件的形式逐个处理XML元素,只在需要时存储少量信息,因此对于大文件来说...

    v1.2 解析XML文件 读取XML文件 保存XML文件 添加节点 删除节点 修改节点 添加属性 修改/删除属性

    功能:创建XML文件的根节点 参数:[in] sName 根节点的节点名 返回:true创建成功 false创建失败 **************************************/ bool CreateRootNode(CString sName); /************************...

    DOM方式解析XML.pdf

    在QT中,可以使用DOM方式解析XML文档,将XML文档读入内存,构建为DOM树,并通过节点遍历的方式实现数据的存取和操作。 在DOM方式中,XML文档中的每个成分都是一个节点。例如,整个文档对应一个文档节点;每个XML...

    易语言读入xml到高级表格源码

    2. **解析XML结构**:读取XML文件后,需要解析其结构。XML文档由元素、属性、文本等构成,易语言需要逐层解析这些结构。可以使用递归函数或循环结构来遍历XML树,获取每个节点的信息。 3. **构建表格模型**:解析...

    iOS开发中常见的解析XML的类库以及简要安装方法

    DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。 SAX解析XML,是基于事件通知的...

    Xml文件dom解析

    这是使用DOM解析XML的关键步骤,我们将XML文件读入一个`Document`对象: ``` File inputFile = new File("beans.xml"); Document doc = builder.parse(inputFile); ``` 6. **获取根元素**: 一旦解析完成,...

    读入xml文件生成treeview

    ### 读入XML文件生成TreeView知识点详解 #### 一、背景与需求 在进行Flex项目的开发过程中,常常需要处理XML格式的数据。一个常见的任务就是将XML文件中的数据转化为可视化的TreeView结构,以便用户能直观地浏览和...

    python pyqt5 使用QTreeWidget 和 xml模块 将 xml文件信息 自动读入并展示到树形控件上的示例程序

    程序文件主要包括两部分功能:一是使用python自带的xml.etree.ElementTree类读入和解析xml树形信息文件;二是使用 PyQt5 的 QTreeWidget 构建树,并将信息展示到Tree 的对应节点Item上。 初次接触xml和QTreeWidget...

    pull解析xml

    在Android开发中,"Pull解析xml"是一种常见的处理XML数据的方式。XML(eXtensible Markup Language)是一种用于标记数据的结构化语言,常用于网络数据交换和存储。本篇文章将深入探讨Android中的Pull解析机制以及...

    Matlab解析XML文件.rar

    l xmlread(), 用于读取XML文件内容,读入后的变量是一个Java XML object。 l xmlwrite(), 用于写入XML文件内容,同样输出变量也要是一个Java XML Object。 l xslt(),用于stylesheet转换的问题,所以就没有关系。 ...

    详解android使用SAX解析XML文件

    解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析。 DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了。 优点:整个文档读入内存,...

    java 解析xml

    - **原理**:DOM 解析器会将整个 XML 文档读入内存,并构建一个完整的树形结构(节点树)。这使得用户可以通过标准的 DOM 接口操作这个树结构,包括查询节点、修改节点等。 - **优点**: - 易于使用:提供了丰富的 ...

    Java中XML的解析与创建方法实例(题目见描述)

    2 读入XML文件bookA.xml,加入一条处理指令,修改第一本书的价格和作者,并添加一条属性,然后写入文件bookB.xml 3 解析abc.xml文档,读取所有属性和子节点并输出 4 解析parse.xml文档,创建方法新增节点、根据ID...

    xml文档解析实现ajax功能

    XML在这里可能是服务器返回的数据,通过AJAX请求获取后,前端JavaScript代码利用DOM解析XML,将数据填充到页面相应的元素中,从而实现联动菜单效果。联动菜单通常是用户在一个下拉选项中选择一项后,根据选择自动...

Global site tag (gtag.js) - Google Analytics