Dom——根据xpath生成xml

根据传入的xpath生成对应的xml文件

国内网站上这一块可以参考的东西很少,所有自己写了一个工具类,不需要导入额外的jar包,给大家分享一下

输入文件:

input.txt

Student/PlayGame
Student/FallInLove
Student/WatchTV
Student/Games/LOL
Student/Games/CF
Student/Games/DNF
Student/Lovers/Jack
Student/Lovers/Daniel
Student/Lovers/Lily
Student/Money/dollar
Student/Money/RMB
Student/Vehicle/BMW

代码:

package com.blog;


import java.io.*;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.*;


/**
 * @Author Daniel
 * @Description 自制工具类:给定Xpath生成XML文件
 **/

public class XMLUtils {
    static final String NODENAME_SEP = "/";

    public static void main(String[] args) throws Exception {
        File inputFile = new File("input.txt");
        File outputFile = new File("output.xml");
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inputFile));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outputFile));
        byte[] bu = new byte[1024 * 1024 * 8];
        int len;
        //将给定的Xpath结合成一个大的字符串
        StringBuilder xpaths = new StringBuilder();
        while ((len = bis.read(bu)) != -1) {
            xpaths.append(new String(bu, 0, len));
        }
        String rootName = xpaths.substring(0, xpaths.indexOf("/"));
        String xml = createXML(rootName, xpaths.toString());
        bos.write(xml.getBytes());
        bos.close();
        bis.close();
        System.out.println("finished");
    }

    //创建XML字符串
    public static String createXML(String rootName, String xpaths) {
        Document doc = createDocument(rootName, null);
        Element root = doc.getDocumentElement();
        //按行切割字符串
        String[] split = xpaths.split("\r\n");
        for (String s : split) {
            //replaceFirst用来删除root节点的名字
            createNode(doc, root, s.replaceFirst(rootName + "/", ""), "somevalue");
        }
        return getResult(doc);
    }

    //初始化Document对象
    public static Document createDocument(String name, String namespace) {
        //前置操作
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = null;
        try {
            db = dbf.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        DOMImplementation impl = db.getDOMImplementation();
        //必须使用DOMImplementation类中的createDocument方法来创建root节点
        Document doc = impl.createDocument(namespace, name, null);
        return doc;
    }

    //创建所有节点
    public static void createNode(Document doc, Node parentNode, String childName, String text) {
        String[] childNames = childName.split(NODENAME_SEP);
        String childNodeName = childNames[0];
        //获取到子节点
        Node childNode = getChildByName(parentNode, childNodeName);
//        Node childNode = ((Element) parentNode).getElementsByTagName(childNodeName).item(0);//这种写法错误,如果出现同名则会有问题
        //不为空说明已经创建过父级节点,然后创建子级节点
        if (childNode != null) {
            //长度大于1才有子级节点
            if (childNames.length > 1) {
                StringBuilder str = new StringBuilder();
                for (int i = 1; i < childNames.length; i++) {
                    str.append(childNames[i] + NODENAME_SEP);
                }
                //递归创建
                createNode(doc, childNode, str.toString(), text);
                return;
            }
        }
        childNode = doc.createElement(childNodeName);
        //由于前面将childNames中的第一个元素作为判断Node是否为空的条件,如果这个节点的上一级不为root的话无法将其添加上去,这段代码就是用来解决这个问题
        if (childNames.length > 1) {
            //同上面逻辑
            StringBuilder str = new StringBuilder();
            for (int i = 1; i < childNames.length; i++) {
                str.append(childNames[i] + NODENAME_SEP);
            }
            //与上面不同的是这里要添加节点
            parentNode.appendChild(childNode);
            createNode(doc, childNode, str.toString(), text);
            return;
        }
        childNode.setTextContent(text);
        parentNode.appendChild(childNode);
    }

    //输出XML
    public static String getResult(Document xml) {
        Transformer tf = null;
        try {
            tf = TransformerFactory.newInstance().newTransformer();
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        }
        tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        Writer out = new StringWriter();
        try {
            tf.transform(new DOMSource(xml), new StreamResult(out));
        } catch (TransformerException e) {
            e.printStackTrace();
        }
        return out.toString().substring(out.toString().indexOf(">") + 1);
    }

    public static Node getChildByName(Node parentNode, String childName) {
        //获取当前node下的所有子节点
        NodeList list = parentNode.getChildNodes();
        String nodeName;
        //遍历子节点,找出子节点中与形参childName值相同的节点
        for (int i = 0; i < list.getLength(); i++) {
            nodeName = list.item(i).getNodeName();
            if (nodeName.equals(childName))
                return list.item(i);
        }
        //如果没有子节点则返回空值
        return null;
    }

}


输出结果:

output.xml

<Student><PlayGame>somevalue</PlayGame><FallInLove>somevalue</FallInLove><WatchTV>somevalue</WatchTV><Games><LOL>somevalue</LOL><CF>somevalue</CF><DNF>somevalue</DNF></Games><Lovers><Jack>somevalue</Jack><Daniel>somevalue</Daniel><Lily>somevalue</Lily></Lovers><Money><dollar>somevalue</dollar><RMB>somevalue</RMB></Money><Vehicle><BMW>somevalue</BMW></Vehicle></Student>
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C# XML入门经典——C#编程人员必备的XML技能 作者:[美]Stewart Fraser, Steven 著,毛尧飞,崔伟 译 出版社:清华大学出版社 出版时间:2003年11月 第1章 在C#中使用XML的原因1.1 使用XML的原因1.1.1 开放性1.1.2 简单性1.1.3 自我描述性1.1.4 互操作性1.1.5 结构1.1.6 分开结构和内容1.1.7 可扩展性1.2 什么是XML1.2.1 XML涉及多种语言1.2.2 XML文档1.3 使用XML的对象1.3.1 内容表示1.3.2 B2B电子商务1.3.3 远程过程调用1.3.4 数据存储和访问1.3.5 不使用XML的情况1.4 XML标准1.4.1 什么是W3C1.4.2 XML标准1.4.3 与XML相关的标准1.4.4 标准重要的原因1.5 XML如何适应.NET1.5.1 在.NET Framework中使用XML1.5.2 .NET中的XML支持1.6 小结第2章 XML概述2.1 XML的概念2.1.1 XML元素2.1.2 XML属性2.1.3 XML解析器2.1.4 构建XML2.1.5 XML文档的各个组成部分2.2 创建格式良好的XML文档2.2.1 XML中的元素2.2.2 XML中的属性2.2.3 在XML中使用注释2.3 验证XML文档的有效性2.3.1 文档类型定义2.3.2 XML Schema2.3.3 XML编码2.4 小结第3章 在.NET中使用XML3.1 XML如何适合.NET3.1.1 XML3.1.2 文档对象模型(DOM)3.1.3 命名空间3.1.4 DTD和XML Schema3.1.5 XPath 3.1.6 XSLT3.2 .NET Framework使用XML3.2.1 配置文件3.2.2 ADO.NET3.2.3 SOAP和Web服务3.3 案例分析——电话簿样式应用程序3.4 小结第4章 在.NET中读取XML4.1 流模型4.1.1 流模型和DOM的比较4.1.2 流模型中的变体4.2 XmlTextReader类4.2.1 XmlTextReader属性4.2.2 读取属性4.2.3 读取较大的数据块4.3 XmlNodeReader类4.4 XmlValidatingReader类4.5 小结第5章 在.NET中编XML5.1 利用.NET类编XML文档5.2 XmlWriter类5.2.1 XmlWriter方法5.2.2 XmlWriter属性5.3 XmlWriter类5.3.1 XmlTextWriter构造函数5.3.2 XmlTextWirter属性5.3.3 处理XmlTextWirter5.3.4 入较大的数据块5.4 小结第6章 在.NET中实现DOM6.1 文档对象模型6.1.1 文档对象模型与流模型6.1.2 .NET DOM继承模型6.2 XmlNode类6.2.1 XmlNode的定义6.2.2 XmlNode的属性6.2.3 XmlNode的方法6.3 XmlDocument类6.3.1 创建节点6.3.2 加载和保存6.3.3 迭代XmlDocument实例6.3.4 编辑XML文档6.4 案例分析6.4.1 体系结构6.4.2 应用程序详细信息6.4.3 加载用户联系人6.4.4 搜索联系人6.4.5 导出联系人6.4.6 导入其他联系人6.5 小结第7章 XPath和.NET7.1 System.Xml.XPath命名空间7.2 .NET中的XPath类7.2.1 XPathDocument类<br

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DanielMaster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值