• 使用jdom操作xml文件 去除子节点带有命名空间


    package com.soft.common;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import org.jdom2.Namespace;
    
    /**
     * 节点操作属性封装
     * @author xingxf
     *
     */
    public class Nodes {
    	
    	//文件路径
    	private String path;
    	
    	//节点名称
    	private String  NodeName;	
    	
    	//xml命名空间
    	private Namespace nameSpace;
    	
    	//节点文本值
    	private String content;		
    	
    	//节点属性名  key 节点属性值  value
    	private Map<String, String> attribute=new HashMap<String, String>();	
    	
    	
    	public String getPath() {
    		return path;
    	}
    	
    	public void setPath(String path) {
    		this.path = path;
    	}
    	
    	public Nodes() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    
    	public Nodes(String path, String nodeName, Namespace nameSpace,
    			String content, Map<String, String> attribute) {
    		super();
    		this.path = path;
    		NodeName = nodeName;
    		this.nameSpace = nameSpace;
    		this.content = content;
    		this.attribute = attribute;
    	}
    	
    	public Nodes(String nodeName, String content, Map<String, String> attribute) {
    		super();
    		NodeName = nodeName;
    		this.content = content;
    		this.attribute = attribute;
    	}
    
    
    	public String getNodeName() {
    		return NodeName;
    	}
    	public void setNodeName(String nodeName) {
    		NodeName = nodeName;
    	}
    	public Namespace getNameSpace() {
    		return nameSpace;
    	}
    	public void setNameSpace(Namespace nameSpace) {
    		this.nameSpace = nameSpace;
    	}
    
    
    	public String getContent() {
    		return content;
    	}
    
    
    	public void setContent(String content) {
    		this.content = content;
    	}
    
    
    	public Map<String, String> getAttribute() {
    		return attribute;
    	}
    
    
    	public void setAttribute(Map<String, String> attribute) {
    		this.attribute = attribute;
    	}
    
    	public Map<String, String> setmap(String key,String value){
    		Map<String, String> map=new HashMap<String, String>();
    		map.put(key, value);
    		return map;
    	}
    
    	
    }
    

      

    package com.test;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.jdom2.Document;
    import org.jdom2.Element;
    import org.jdom2.JDOMException;
    import org.jdom2.Namespace;
    import org.jdom2.input.SAXBuilder;
    import org.jdom2.output.Format;
    import org.jdom2.output.XMLOutputter;
    
    import com.soft.common.Nodes;
    
    
    
    public class XmlOperationUtils {
    	
    	public static void main(String[] args) {
    		try {
    			XmlOperationUtils dj = new XmlOperationUtils();
    	
    			String file = "D:/Tomcat/webapps/oagovern/WEB-INF/flowtemplate/dd.jpdl.xml";// 设置文件路径和名称;
    			Nodes nodes=new Nodes();
    			nodes.setPath(file);
    			nodes.setNodeName("persons");
    			nodes.setNameSpace(Namespace.getNamespace("http://jbpm.org/4.4/jpdl"));
    			Map<String, String> attr=new HashMap<String, String>();
    			attr.put("name", "test1");
    			attr.put("type", "String");
    			attr.put("key", "test");
    			attr.put("value", "value");
    			nodes.setAttribute(attr);
    			nodes.setContent("小明学习Java");
    			
    			//初始化xml
    			dj.initXmlNode(nodes);
    			
    			//获取根节点
    			Document document = dj.getRootElement(nodes.getPath());
    			Element root=dj.getRootNode(document);
    			
    			//添加子级节点
    			Nodes childNode=new Nodes("person", "test", nodes.setmap("name", "hello"));
    			Element child =dj.createChildElement(root,childNode);	
    			
    			//添加子级的子级
    			Nodes childNodes=new Nodes("student", "小明学习Java", nodes.setmap("type", "int"));
    			dj.createChildElement(child,childNodes);
    			
    			
    			// 生成xml
    			dj.StoreXmlToFile(document, nodes.getPath());
    			
    			//解析xml
    			dj.parserXml(file);
    			
    			
    			
    		} catch (JDOMException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		
    	}
    	
    
    	/**
    	 *
    	 * @param filepath 文件路径  
    	 */
    	public void createXml(String filepath) { 
    		Document document = new Document();
    		Namespace ns= Namespace.getNamespace("http://jbpm.org/4.4/jpdl");
    		Element root = new Element("persons",ns).setAttribute("name", "persons");
            document.setRootElement(root);
            createChildElements(root);
            StoreXmlToFile(document, filepath);
        }  
    	
    	
    	
    	
    	/**
    	 * 初始化xml根节点和文件
    	 * @param nodes
    	 */
    	public  boolean initXmlNode(Nodes nodes){
    		boolean flag=false;
    		if (nodes!=null) {
    			
    			Document document=new Document();
    			
    			Element root=new Element(nodes.getNodeName(),nodes.getNameSpace());
    			Map<String, String> map=nodes.getAttribute();
    				for (String key:map.keySet()) {
    					System.out.println("key:"+key+" and value:"+map.get(key));
    					root.setAttribute(key,map.get(key));
    				}
    			
    			document.setRootElement(root);
    			
    			StoreXmlToFile(document, nodes.getPath());
    			flag=true;
    		}
    		
    		return flag;
    	}
    	
    	/**
    	 * 获取根节点
    	 * @param document 根据路径获得的文档
    	 * @return 根节点
    	 */
    	public Element getRootNode(Document document){
    		return document.getRootElement();
    	}
    	
    	/**
    	 *  创建xml子节点  
    	 * @param parent 父节点
    	 * @param nodes	节点实例对象
    	 */
    	private Element createChildElement(Element parent ,Nodes nodes) {
    		Element child=new Element(nodes.getNodeName());
    		Map<String, String> map=nodes.getAttribute();
    		for(String key:map.keySet()){
    			child.setAttribute(key,map.get(key));
    		}
    		setChildElementNS(child,parent);
    		child.setText(nodes.getContent());
    		parent.addContent(child);
    		return child;
    
    	}
    	
    	/**
    	 * 设置子级元素的命名空间  可以实现去除子节点命名空间
    	 * @param child  ChildrenElement
    	 * @param root	 RootElement
    	 */
    	private void setChildElementNS(Element child, Element root) {
    		child.setNamespace(root.getNamespace());
    	}
    	
    	
    	/**
    	 * 生成xml文件
    	 * @param document xml文档
    	 * @param fliePath 文件路径
    	 */
    	private void StoreXmlToFile(Document document, String fliePath) {
    		XMLOutputter XMLOut = new XMLOutputter();
    		try {
    			Format f = Format.getPrettyFormat();
    			f.setEncoding("UTF-8");// default=UTF-8
    			XMLOut.setFormat(f);
    			XMLOut.output(document, new FileOutputStream(fliePath));
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	
    	
    	/**
    	 * 添加xml文件节点内容
    	 * @param root 根节点
    	 */
    	private void createChildElements(Element root) {
    		
    		//在root节点下创建子节点
    		Element person = new Element("person"); 
    		person.setNamespace(root.getNamespace());
            root.addContent(person); 
            
            Element name = new Element("name");  
            name.setText("java小强");
            name.setNamespace(root.getNamespace());
            person.addContent(name);
            
            Element sex = new Element("sex");  
            sex.setText("man");
            sex.setNamespace(root.getNamespace());
            person.addContent(sex); 
           
           
            Element start=new Element("start").setAttribute("name", "satrt1");
            start.setAttribute("class", "start");
            start.setNamespace(root.getNamespace());
            root.addContent(start);
            
            Element trations=new Element("trations");
            setChildElementNS(trations, root);
            start.addContent(trations);
            
            Element heand=new Element("heand");
            heand.setText("Java操作");
            setChildElementNS(heand, root);
            trations.addContent(heand);
           
    	}
    	
    	/**
    	 * 根据路径获取xml文档
    	 * @param file 文件路径
    	 */
    	public Document getRootElement(String file) throws JDOMException, IOException{
    			SAXBuilder builder=new SAXBuilder();
    			return builder.build(file);
    	}
    	
    	
    	
    	 /**   
         * 解析XML   
         * @param filePath 文件路径   
         */   
        public void parserXml(String file) {  
            try {  
            	Document document=getRootElement(file);
                Element root = document.getRootElement();
                List persons = root.getChildren("person");  
                for (int i = 0; i < persons.size(); i++) {  
                    Element person = (Element) persons.get(i);  
                    List pros = person.getChildren();  
                    for (int j = 0; j < pros.size(); j++) {  
                        Element element = (Element) pros.get(j);  
                        System.out.println(element.getName() + ":" + element.getValue());  
                    }  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
    }  
    

      jdom-2.0.6.jar

    解决思路:

      理论:当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。

      方法:为该xml的子节点添加与父节点相同的命名空间方法 可以去除子节点含有命名空间

    下载链接

  • 相关阅读:
    python自动化之利用configparser库获取配置文件中的section,option,value值
    python自动化之pymysql库连接mysql数据库封装成类
    python中封装pymysql库连接mysql数据库
    python自动化之requests库封装
    OS模块获取文件相对路径
    元素定位之xpath定位详解
    Jmeter工具-连接postgresql数据库+提取参数并应用到下个接口中
    JDK安装与环境变量配置
    python使用psycopg2连接postgresql数据库
    SQL的in的参数化查询
  • 原文地址:https://www.cnblogs.com/a757956132/p/4718099.html
Copyright © 2020-2023  润新知