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的,必须有中文字符~谢谢各位高手

解决方案 »

  1.   

    你的文件的格式是什么?是UTF8的吗?
    不是指 <?Xml ..?> 这里的声明,而是指文件本身的格式,可以通过 windows的 notepad 的另存为查看
      

  2.   

    http://blog.csdn.net/lihe2008125/archive/2008/08/06/2776973.aspx
    我没测试
      

  3.   

    你既然要用中文字符,就必须把xml的源文件的编码改成GBK,否则只能出现乱码了。
      <?xml version="1.0" encoding="GBK" ?>
      

  4.   

    使用jdom可读取utf-8格式的xml文件public void jdomLoadXML() {
    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>
      

  5.   


    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();
    } }}
      

  6.   

    有两个地方要设置,我是在eclipse环境下
    1,就是xml本是的编码属性是不是UTF-8的 查看 文件的properites
    2,就是xml文档内容的编码是不时UTF-8的<?xml version="1.0" encoding="UTF-8"?>  经过测试能出来中文
      

  7.   

    使用Dom也可以解决编码问题:把document=builder.parse(new File(filename));改成字节读取,如下:
                    // 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);