Java Dom生产xml文件根节点未换行

拿客-三产 发布于 2016/10/08 16:34
阅读 613
收藏 0
代码如下:环境jdk8 windows10
package project_xml; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Result; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class xml_dom { public static void main(String[] args) {
        File file=new File("book.xml"); try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        xml_dom xml_dom1=new xml_dom(); //        xml_dom1.xml_dom_parse();  xml_dom1.creat_xml();
    } public void xml_dom_parse() {
        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); try {
            DocumentBuilder db=dbf.newDocumentBuilder();
            Document docu=db.parse("book.xml"); //获取所有的书籍节点  NodeList booklist=docu.getElementsByTagName("book"); for(int i =0;i<booklist.getLength();i++){
                Node book_item=booklist.item(i);
                System.out.println(""+(i+1)+"本书");
                NamedNodeMap node_att=book_item.getAttributes();//读取属性,并存在一个<span style="font-family: Arial, Helvetica, sans-serif;">NamedNodeMap</span>  for(int j=0;j<node_att.getLength();j++){
                    Node node=node_att.item(j);
                    System.out.print(node.getNodeName()+":"+node.getNodeValue()+" ");
                    System.out.println();
                }
                NodeList book_child=book_item.getChildNodes(); for(int k=0;k<book_child.getLength();k++){
                    Node book_child_ele=book_child.item(k); if(book_child_ele.getNodeType()==Node.ELEMENT_NODE){//如果没有会打印出很多空格,因为text也是一种节点类型,  //System.out.println(book_child_ele.getNodeName()+":"+book_child_ele.getFirstChild().getNodeValue());  ////这个就是采集到这个<name></name>中所有的所有的text  System.out.println(book_child_ele.getNodeName()+":"+book_child_ele.getTextContent());
                    }
                }
                System.out.println("以上就是第"+(i+1)+"本书");


            }
        } catch (ParserConfigurationException e) { // TODO Auto-generated catch block  e.printStackTrace();
        } catch (SAXException e) { // TODO Auto-generated catch block  e.printStackTrace();
        } catch (IOException e) { // TODO Auto-generated catch block  e.printStackTrace();
        }
    } public void creat_xml() { try {
            DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
            DocumentBuilder db=dbf.newDocumentBuilder();
            Document document=db.newDocument(); //可以将standalone设置为true,这样就不会显示了,表示的意思是不需要说明文档  document.setXmlStandalone(true);
            Element bookstore=document.createElement("bookstore");
            Element book=document.createElement("book");
            Element name=document.createElement("name");
            name.setTextContent("安徒生童话");
            book.setAttribute("id", "1");
            book.setAttribute("size", "lower");
            book.appendChild(name);
            bookstore.appendChild(book);
            document.appendChild(bookstore);
            TransformerFactory tf=TransformerFactory.newInstance();
            Transformer transformer=tf.newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.transform(new DOMSource(document), new StreamResult(new File("book1.xml")));
        } catch (ParserConfigurationException  e) { // TODO Auto-generated catch block  e.printStackTrace();
        } catch (TransformerConfigurationException e) { // TODO Auto-generated catch block  e.printStackTrace();
        } catch (TransformerException e) { // TODO Auto-generated catch block  e.printStackTrace();
        }

    }

}

代码如上,生成的xml如下

根节点没有和第一行换行,求怎么能解决这个问题呢?

期望的结果:

加载中
0
拿客-三产
拿客-三产

引用来自“李玉珏”的评论

加入如下代码就可以了:

transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");              transformer.setOutputProperty(OutputKeys.INDENT, "yes");

transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");              transformer.setOutputProperty(OutputKeys.INDENT, "yes");

0
李玉珏
李玉珏
你可以试一下Document的normalize() 方法。
拿客-三产
拿客-三产
回复 @李玉珏 : 也不行,试过了
李玉珏
李玉珏
回复 @拿客-三产 : 这个地方不行,你在所有的XML元素构建完毕之后试试看
拿客-三产
拿客-三产
回复 @李玉珏 : Document document=db.newDocument();之后
李玉珏
李玉珏
回复 @拿客-三产 : 你这个代码放在什么位置了?
拿客-三产
拿客-三产
不过还是谢谢你~\(≧▽≦)/~啦啦啦
下一页
0
毕竟我是小米粥
毕竟我是小米粥
写出的时候 需要一个格式化类 我记得
拿客-三产
拿客-三产
可以详细说下么?查了很多都没找到解决的办法
0
J_sky
J_sky
Element bookstore=document.createElement("bookstore");

在之句之前输出一个回车或是换行试试?



拿客-三产
拿客-三产
解决的这么生硬?
0
李玉珏
李玉珏

加入如下代码就可以了:

transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");              transformer.setOutputProperty(OutputKeys.INDENT, "yes");

v
verios
可以了,非常感谢!
拿客-三产
拿客-三产
谢谢,一会儿试一下
返回顶部
顶部