以下的代码适用于JDK1.4
/**
 * Creates a new xml file.
 * @param dest_file a <code>String</code> object, the file which we will create.
 */
private void creatNewDocument(String dest_file)
{
try
{
//create a new document
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
DOMImplementation DOMImpl = builder.getDOMImplementation();
//System.out.println(DOMImpl.hasFeature("", "2.0"));
Document document = DOMImpl.createDocument(null, "EMPLOYEE", null);
Element root = document.getDocumentElement();
Text space = document.createTextNode("\n  ");
root.appendChild(space);
Element element = document.createElement("NAME");
element.setAttribute("SEX", "male");
//document.appendChild(element);
Text name = document.createTextNode("Einstein");
element.appendChild(name);
root.appendChild(element);
//Write a document to a file
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Source source = new DOMSource(document);
Transformer transformer = transformerFactory.newTransformer();
File file = new File(dest_file);
OutputStream bout = new FileOutputStream(dest_file);
OutputStreamWriter out = new OutputStreamWriter(bout, "ISO-8859-1");
Result result = new StreamResult(bout);
transformer.transform(source, result);
}
catch (ParserConfigurationException pce)
{
pce.printStackTrace();
}
catch (TransformerConfigurationException tce)
{
tce.printStackTrace();
}
catch (UnsupportedEncodingException uee)
{
uee.printStackTrace();
}
catch (TransformerException te)
{
te.printStackTrace();
}
catch (FileNotFoundException fnfe)
{
fnfe.printStackTrace();
}
}

解决方案 »

  1.   

    修改一个xml文档
    /**
     * Updates a xml file and write it to a new file.
     * @param file_url a <code>String</code> object, the file which we will parse
     */
    private void updateNewDocument(String file_url)
    {
    Document document = (Document) getDocument(file_url);
    followNode(document);
    try
    {
    TransformerFactory factory = TransformerFactory.newInstance();
    Source source = new DOMSource(document);
    Transformer transformer = factory.newTransformer();
    File file = new File("C:/caike2/aaa.xml");
    OutputStream bout = new FileOutputStream(file);
    OutputStreamWriter out = new OutputStreamWriter(bout, "ISO-8859-1");
    Result result = new StreamResult(bout);
    transformer.transform(source, result);
    }
    // catch(ConfigurationException ce)
    // {
    // ce.printStackTrace();
    // }
    catch (TransformerConfigurationException tce)
    {
    tce.printStackTrace();
    }
    catch (IOException io)
    {
    io.printStackTrace();
    }
    catch (TransformerException te)
    {
    te.printStackTrace();
    }
    } /**
     * Gets a xml document
     * @param file_url a <code>String</code> object, the file which we will parse.
     * @return
     */
    private Node getDocument(String file_url)
    {
    Document document = null;
    try
    {
    DOMParser parser = new DOMParser();
    parser.parse(file_url);
    document = parser.getDocument();
    }
    catch (IOException io)
    {
    io.printStackTrace();
    }
    catch (SAXException saxe)
    {
    saxe.printStackTrace();
    }
    return document;
    } /**
     * Analyses the xml document.
     * @param node a <code>Node</code> object, which we will analyses
     */
    private void followNode(Node node)
    {
    // try
    // {
    System.err.println("_______________begin_______________");
    System.out.println(
    "node name: " + node.getNodeName() + "\nnode type: " + node.getNodeType());
    //////////////////////////
    //增加一个新节点
    //////////////////////////
                    Document owner = node.getOwnerDocument();
                    Node newNode = owner.createElement("Name");
                    node.appendChild(newNode);
                    //给新节点添加属性
                    newNode.setAttribute("SEX", "male");
                    //在新节点加入文本
                    Text name = document.createTextNode("Einstein");
                    newNode.append(name);
    ////////////////////////////
    //添加节点结束
    ////////////////////////////
    String value = node.getNodeValue();
    if (value != null)
    {
    if (value.equals("3"))
    {
    Node parent = node.getParentNode();
    parent.removeChild(node);
    }
    System.out.println(" value: -" + value + "-");
    }
    System.err.println("________________end_______________");
    if (node.hasChildNodes())
    {
    Node firstNode = node.getFirstChild();
    followNode(firstNode);
    }
    Node nextNode = node.getNextSibling();
    if (nextNode != null)
    {
    //System.out.println("nextNode is not null");
    followNode(nextNode);
    }
    // }
    // catch(DOMException dom)
    // {
    // dom.printStackTrace();
    // }
    }
      

  2.   

    to zxmzfbdc(也速该把阿秃儿):通过creatNewDocument生成的文件如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <EMPLOYEE>
      <NAME SEX="male">Einstein</NAME></EMPLOYEE>怎样让</EMPLOYEE>换行?
      

  3.   

    查一下DOM的API,自己试着写,
    http://www-900.ibm.com/developerworks/cn/xml/index.shtml
    里面有几篇IBM的文章,讲得不错。
      

  4.   

    输出时用apache的xerces解析器可以格式化,可以到apache的官方网站www.apache.org下载,
    修改如下:
    import org.apache.xml.serialize.OutputFormat;
    import org.apache.xml.serialize.XMLSerializer; /**
     * Creates a new xml file.
     * @param dest_file a <code>String</code> object, the file which we will create.
     */
    private void creatNewDocument(String dest_file)
    {
    try
    {
    //create a new document
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    DOMImplementation DOMImpl = builder.getDOMImplementation();
    //System.out.println(DOMImpl.hasFeature("", "2.0"));
    Document document = DOMImpl.createDocument(null, "EMPLOYEE", null);
    Element root = document.getDocumentElement();
    Text space = document.createTextNode("\n  ");
    root.appendChild(space);
    for (int i = 0; i < 5; i++)
    {
    Element element = document.createElement("NAME");
    element.setAttribute("SEX", "male");
    //document.appendChild(element);
    Text name = document.createTextNode("Einstein" + i);
    element.appendChild(name);
    root.appendChild(element);
    }
    //Write a document to a file
    //TransformerFactory transformerFactory = TransformerFactory.newInstance();
    //Source source = new DOMSource(document);
    //Transformer transformer = transformerFactory.newTransformer();
    File file = new File(dest_file);
    OutputStream bout = new FileOutputStream(dest_file);
    OutputStreamWriter out = new OutputStreamWriter(bout, "ISO-8859-1");
    //Result result = new StreamResult(bout);
    //transformer.transform(source, result); //xerces write a document to a file
    OutputFormat format = new OutputFormat(document);
                            //是否缩进
    format.setIndenting(true);
                            //设置每行的字符数
    format.setLineWidth(50);
                            //设置每行缩进的字符数
    format.setIndent(4);
                            //序列化
    XMLSerializer serializer = new XMLSerializer(bout, format);
                            //把xml文档写入指定的文件
    serializer.serialize(document);
    out.flush();
    out.close();
    bout.close();
    }
    catch (ParserConfigurationException pce)
    {
    pce.printStackTrace();
    }
    // catch (TransformerConfigurationException tce)
    // {
    // tce.printStackTrace();
    // }
    catch (UnsupportedEncodingException uee)
    {
    uee.printStackTrace();
    }
    // catch (TransformerException te)
    // {
    // te.printStackTrace();
    // }
    catch (FileNotFoundException fnfe)
    {
    fnfe.printStackTrace();
    }
    catch(IOException io)
    {
    io.printStackTrace();
    }
    }
      

  5.   

    再问一个问题:要在50M以上的文件中添加一个节点有什么好方法?用dom总是提示java.lang.OutOfMemoryError
      

  6.   

    用{ zxmzfbdc(也速该把阿秃儿)}的方法怎么执行的时候总是提示如下的错误啊,
    type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception org.apache.xml.utils.WrappedRuntimeException: The output format must have a '{http://xml.apache.org/xalan}content-handler' property!
    at org.apache.xalan.serialize.SerializerFactory.getSerializer(SerializerFactory.java:142)
    at org.apache.xalan.transformer.TransformerIdentityImpl.createResultContentHandler(TransformerIdentityImpl.java:232)
    at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:296)
    at gissvr.ResXMLError.creatNewDocument(ResXMLError.java:139)
    at gissvr.GISServlet.doPost(GISServlet.java:91)
      

  7.   

    用{ zxmzfbdc(也速该把阿秃儿)}的方法是执行到transformer.transform(source, result);这一部出错的