生成xml文件

生成DOM树

  • 假设要生成的DOM树为以下内容
<?xml version="1.0" encoding="utf-8"?>
<shop>
	<pen>
		<type>钢笔</type>
		<manufacturers id="9567">长城牌</manufacturers>
		<tradePrice>0.5</tradePrice>
		
	</pen>
	<book>
		<name>新的世界,新的你</name>
		<year>3</year>
		<price >56.6</price>
	</book>
	<book>
		<name>java入门到跑路</name>
		<year>111</year>
		<price >100</price>
	</book>
</shop>
  • 无论是解析xml文件还是生成DOM树都需要使用DocumentBuilder操作对象的辅助
    • 一整个xml文件都是一个文件节点,所以要生成DOM也要依靠Document类完成
    public static void main(String[] args)throws Exception{
        //创建文档解析器对象
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

        //创建Document类对象
        Document xmlDoc = documentBuilder.newDocument();
    }

在这里插入图片描述

  • 接着创建Document下的子节点"shop",元素使用Element接口表示,有Document对象负责创建
  • 并将shop元素设置为Document的子节点
        //创建根节点"shop"
        Element shopElement = xmlDoc.createElement("shop");
        //设置关系
        xmlDoc.appendChild(shopElement);

在这里插入图片描述

  • 设置shop的子元素,pen,并将pen元素设置为shop的子元素
        //创建shop的子节点pen
        Element penElement = xmlDoc.createElement("pen");
        //设置为shop的子元素
        shopElement.appendChild(penElement);

在这里插入图片描述

  • 创建三个子元素,并将这个三个元素设置为pen元素的子元素
        //设置pen的三个子节点
        Element type = xmlDoc.createElement("type");
        Element manufactruersEle = xmlDoc.createElement("manufacturers");
        Element tradePriceEle = xmlDoc.createElement("tradePrice");
        //设置pen的子元素
        penElement.appendChild(type);
        penElement.appendChild(manufactruersEle);
        penElement.appendChild(tradePriceEle);

在这里插入图片描述

  • 设置pen元素下三个子元素的内容
        //设置pen子元素的内容
        type.setTextContent("钢笔");
        manufactruersEle.setTextContent("长城牌");
        tradePriceEle.setTextContent("0.5");

在这里插入图片描述

  • manufactures元素中要求有一个id属性,属性值为"9567"
        //设置manufactures元素的属性
        manufactruersEle.setAttribute("id","9567");

在这里插入图片描述

  • 接着设置两个book子元素,由于两个book子元素中的结构相同,所以使用循环的方式来生成两个book子元素,现将要用到元素内容,以数组的形式保存起来
        //保存两个book子元素要用到的数据
        String[] nameValue = new String[]{"新的世界,新的你","java入门到跑路"};
        String[] yearValue = new String[]{"3","111"};
        String[] priceValue = new String[]{"56.6","100"};
  • 循环两次,生成两个book元素,并生成book元素下的三个子元素,并将book元素设置为shop元素的子元素
        for (int i = 0; i < 2; i++) {
            Element bookEle = xmlDoc.createElement("book");
            Element nameEle = xmlDoc.createElement("name");
            nameEle.setTextContent(nameValue[i]);
            Element yearEle = xmlDoc.createElement("year");
            yearEle.setTextContent(yearValue[i]);
            Element priceEle = xmlDoc.createElement("price");
            priceEle.setTextContent(priceValue[i]);
            //设置关系
            bookEle.appendChild(bookEle);
            bookEle.appendChild(yearEle);
            bookEle.appendChild(priceEle);
            shopElement.appendChild(bookEle);
        }

在这里插入图片描述

  • 测试能否取出数据
        //取得根节点下的所有子节点(book)
        NodeList allNode = xmlDoc.getElementsByTagName("book");
        //循环取出每一个子节点
        for (int i = 0; i < allNode.getLength(); i++) {
            Element item = (Element)allNode.item(i);
            System.out.println("书名 : "+ item.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
            System.out.println("出版时间 : "+ item.getElementsByTagName("year").item(0).getFirstChild().getNodeValue());
            System.out.println("价格 : "+ item.getElementsByTagName("price").item(0).getFirstChild().getNodeValue());

        }
  • 输出结果

在这里插入图片描述

输出DOM树到xml文件中

  • 此时生成的DOM树还只是存在内存中,要将DOM树输出到文件中还需要以下两个接口的支持
javax.xml.transform.TransformFactory用于创建Transform对象
javax.xml.transform.Transform用于将DOM树转换为xml文件
  • TransformFactory是一个抽象类,他定义有如下方法取得操作对象
public static TransformerFactory newInstance() throws TransformerFactoryConfigurationError
  • Transform类中使用以下的方法将DOM树转换为xml文件
public abstract void transform(Source xmlSource,Result outputTarget)throws TransformerException
  • 发现transform()这个方法,需要用到两个参数
javax.xml.transform.SourceDOM树数据的来源
javax.xml.transform.Result转换的结果
  • Source类下有一个DOMSource子类,该类中定义有这样一个构造方法,该构造方法接收一个Node接口子类实例化参数,因为Document也是Node接口的子接口,所以可以直接使用Document对象来做构造参数
public DOMSource(Node n)
  • Result接口下有一个StreamResult子类,该类的构造方法有
    • 此类的构造方法可以接受File类和OutputStream类的子类,
public StreamResult(File f)
public void setOutputStream(OutputStream outputStream)
  • Transform类之间的关系为

在这里插入图片描述

生成xml文件

        //得到转换类对象
        TransformerFactory  tf = TransformerFactory.newInstance();
        Transformer tformer = tf.newTransformer();
        //设置转换的文件
        File outFile = new File("e:"+File.separator+"outFile.xml");
        tformer.transform(new DOMSource(xmlDoc),new StreamResult(outFile));

  • 生成的文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?><shop><pen><type>钢笔</type><manufacturers id="9567">长城牌</manufacturers><tradePrice>0.5</tradePrice></pen><book><name>新的世界,新的你</name><year>3</year><price>56.6</price></book><book><name>java入门到跑路</name><year>111</year><price>100</price></book></shop>
  • 但是此时生成的文件中内容时不会换行的,如果希望输出的文件内容会自动换行可以使用Transformer类中以下方法
setOutputProperty(OutputKeys.INDENT, "yes");
  • 修改代码
        //得到转换类对象
        TransformerFactory  tf = TransformerFactory.newInstance();
        Transformer tformer = tf.newTransformer();
        //设置输出xml文件内容换行
        tformer.setOutputProperty(OutputKeys.INDENT, "yes");
        //设置转换的文件
        File outFile = new File("e:"+File.separator+"outFile.xml");
        tformer.transform(new DOMSource(xmlDoc),new StreamResult(outFile));
  • 输出文件内容

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值