package test;import java.io.File;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;public class Test { /**
* load
* 载入一个xml文档
* @return 成功返回Document对象,失败返回null
* @param uri 文件路径
*/
public static Document load(String filename)
{
Document document = null;
try
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//factory.setValidating(true);
//factory.setNamespaceAware(true);
DocumentBuilder builder=factory.newDocumentBuilder();
document=builder.parse(new File(filename));
document.normalize();
}
catch (Exception ex){
ex.printStackTrace();
}
return document;
} public static void main(String[] args) {
Document document = load("d:/marc.xml");
Node root=document.getDocumentElement();
/** 如果root有子元素 */
if(root.hasChildNodes())
{
/** ftpnodes */
NodeList ftpnodes = root.getChildNodes();
/** 循环取得所有节点 */
for (int i=0;i<ftpnodes.getLength();i++)
{
NodeList ftplist = ftpnodes.item(i).getChildNodes();
for (int k=0;k<ftplist.getLength();k++)
{
Node subnode = ftplist.item(k);
if (subnode.getNodeType()==Node.ELEMENT_NODE)
{
/** 打印所有节点属性的值 */
System.out.println(subnode.getNodeName()+":"+subnode.getFirstChild().getNodeValue());
}
}
}
}
}}
错误代码:
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 2-byte UTF-8 sequence.我的xml文件必须是utf=8的,必须有中文字符~谢谢各位高手
不是指 <?Xml ..?> 这里的声明,而是指文件本身的格式,可以通过 windows的 notepad 的另存为查看
我没测试
<?xml version="1.0" encoding="GBK" ?>
try {
BufferedReader inBuffer = new BufferedReader(new FileReader(
"D:/marc.xml"));
StringBuffer replayBuffer = new StringBuffer("");
String tempStr = "";
while ((tempStr = inBuffer.readLine()) != null) {
replayBuffer.append(tempStr);
}
String str = replayBuffer.toString();
byte[] data = str.getBytes("UTF-8");
// byte[] data = str.getBytes();
ByteArrayInputStream bais = null;
bais = new ByteArrayInputStream(data); SAXBuilder builder = new SAXBuilder(); org.jdom.Document read_doc; read_doc = builder.build(bais); Element element = read_doc.getRootElement();// <web-app>
List Bodylist = element.getChildren();
int i = 0;
if (Bodylist != null && Bodylist.size() > 0) {
i = Bodylist.size();
} for (int j = 0; j < i; j++) {// <servlet>根据实际xml文件节点判断for个数,有一定局限性
Element body = (Element) Bodylist.get(j);
List sub = body.getChildren();
for (int t = 0; sub != null && t < sub.size(); t++) {//
Element subEle = (Element) sub.get(t);
System.out.println("------jdom解析utf-8格式xml文件-------------");
System.out.println(subEle.getName() + ":"
+ subEle.getValue());
}
}
} catch (JDOMException e) { } catch (IOException e) { } }
xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<web-app>
<aservlet>
<servlet-name>中文名称</servlet-name>
<servlet-class>com.test</servlet-class>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet>
<servlet-name>中文名称</servlet-name>
<servlet-class>com.system</servlet-class>
<load-on-startup>10</load-on-startup>
</servlet>
</web-app>
package com.yujie.xml;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;/**
* JDom操作xml文件工具 1、创建的user.xml <?xml version="1.0" encoding="utf-8"?>
<list>
<user id="0">
<name>小鱼0</name>
<age>28</age>
<email>[email protected]</email>
</user>
<user id="1">
<name>小鱼1</name>
<age>26</age>
<email>[email protected]</email>
</user>
<user id="2">
<name>小鱼2</name>
<age>26</age>
<email>[email protected]</email>
</user>
</list> 2追加后的user.xml <?xml version="1.0" encoding="gb2312"?>
<list>
<user id="0">
<name>小鱼0</name>
<age>26</age>
<email>[email protected]</email>
</user>
<user id="1">
<name>小鱼1</name>
<age>26</age>
<email>[email protected]</email>
</user>
<user id="2">
<name>小鱼2</name>
<age>26</age>
<email>[email protected]</email>
</user>
<user id="3">
<name>刘德华</name>
<age>48</age>
<email>[email protected]</email>
</user>
</list> * @author Administrator
*
*/
public class JDom {
// 创建XML
public void BuildXMLDoc() throws IOException, JDOMException {
// 创建根节点 root;
Element root = new Element("list");
// 根节点添加到文档中;
Document Doc = new Document(root);
// 此处 for 循环可替换成 遍历 数据库表的结果集操作;
for (int i = 0; i < 3; i++) {
// 创建节点 user;
Element elements = new Element("user");
// 给 user 节点添加属性 id;
elements.setAttribute("id", "" + i);
// 给 user 节点添加子节点并赋值;
elements.addContent(new Element("name").setText("小鱼"+String.valueOf(i)));
elements.addContent(new Element("age").setText("26"));
elements.addContent(new Element("email").setText("[email protected]")); // 给父节点list添加user子节点;
root.addContent(elements);
}
// 定义输出
XMLOutputter XMLOut = new XMLOutputter();
// 设置格式
Format format = Format.getPrettyFormat();
format.setEncoding("utf-8"); // 设置xml文件的字符为gb2312
format.setIndent(" "); // 设置xml文件的缩进为4个空格 XMLOut.setFormat(format);
// 输出 user.xml 文件;
XMLOut.output(Doc, new FileOutputStream("user.xml"));
} // 读XML节点数据
public void ReadXMLDoc() throws IOException, JDOMException {
/** ***********将user.xml个别节点读出显示**************** */
File fn = new File("user.xml");
Document doc = null;
// 建立构造器
SAXBuilder sb = new SAXBuilder();
// 判断文件是否存在
if (fn.exists()) {
try {
// 读入指定文件
doc = sb.build(new FileInputStream("user.xml"));
} catch (Exception e) {
System.out.println(e.getMessage());
}
// 获得根结点
Element root = doc.getRootElement();
// 将根结点下的所有子节点放入List中
List list = root.getChildren(); for (int i = 0; i < list.size(); i++) {
System.out.println("-----------------------");
// 取得节点实例
Element item = (Element) list.get(i);
// 取得当前节点的子节点
String sid = item.getAttribute("id").getValue();// 取得属性值
System.out.println("id:" + sid); Element Name = item.getChild("name");
String sname = Name.getText();// 取得当前节点的值
System.out.println("Name:" + sname);
}
} else {
System.out.println("Not found child element!");
} /*
* 将user.xml内容在控制台显示 //建立构造器 SAXBuilder builder = new SAXBuilder();
* Document doc = null; //读入指定文件 doc = builder.build(new
* FileInputStream("user.xml")); XMLOutputter fmt = new XMLOutputter();
* Format format = Format.getPrettyFormat();
* format.setEncoding("gb2312"); //设置xml文件的字符为gb2312 format.setIndent("
* "); //设置xml文件的缩进为4个空格 fmt.setFormat(format); PrintWriter out=new
* PrintWriter(System.out); //不加 中文会乱码 fmt.output(doc, out);
*/ } // 在XML文件尾部追加
public void AddXMLDoc() throws IOException, JDOMException {
File fn = new File("user.xml");
Document doc = null;
SAXBuilder sb = new SAXBuilder();
// 如果文件存在
if (fn.exists()) {
try {
doc = sb.build(new FileInputStream("user.xml"));
} catch (Exception e) {
System.out.println(e.getMessage());
} Element root = doc.getRootElement();
if (root.getContentSize() > 0) {
List list = root.getChildren();
Element elements = new Element("user");
// 给 user 节点添加属性 id;
elements.setAttribute("id", "" + list.size());
elements.addContent(new Element("name").setText("刘德华"));
elements.addContent(new Element("age").setText("48"));
elements.addContent(new Element("email")
.setText("[email protected]")); // 给父节点list添加user子节点;
root.addContent(elements);
// 设置输出格式
Format f = Format.getPrettyFormat();
f.setIndent(" ");
f.setEncoding("utf-8");
XMLOutputter output = new XMLOutputter(f);
try {
output.output(doc, new FileOutputStream("user.xml"));
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
// 如果文件不存在
else {
System.out.println("Not found child element!");
} } else {
System.out.println("找不到指定的文件!");
}
} /**
* @param args
*/
public static void main(String[] args) {
try {
JDom jdom = new JDom();
jdom.BuildXMLDoc(); //创建
// jdom.AddXMLDoc(); //追加
jdom.ReadXMLDoc();// 读取
} catch (Exception e) {
e.printStackTrace();
} }}
1,就是xml本是的编码属性是不是UTF-8的 查看 文件的properites
2,就是xml文档内容的编码是不时UTF-8的<?xml version="1.0" encoding="UTF-8"?> 经过测试能出来中文
// document=builder.parse(new File(filename));
BufferedReader inBuffer = new BufferedReader(new FileReader(
filename));
StringBuffer replayBuffer = new StringBuffer("");
String tempStr = "";
while ((tempStr = inBuffer.readLine()) != null) {
replayBuffer.append(tempStr);
}
String str = replayBuffer.toString();
/**
* 此处若不指定编码utf-8,则会报如下错误
* org.xml.sax.SAXParseException: 字符转换错误:“Malformed UTF-8 char -- is an XML encoding declaration missing?”(行号可能太小)。
*/
byte[] data = str.getBytes("utf-8");
// byte[] data = str.getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(data);
document = builder.parse(bais);