摘要
本文讲解了在java中使用dom4j去除xmlns的方法,以及给朋友们分享如何正确生成只有一个xmlns命名空间的方法。
本文讲解了在java中使用dom4j去除xmlns的方法,以及给朋友们分享如何正确生成只有一个xmlns命名空间的方法。
我们在使用java的DOM4J生成XML文件时,如果想在根目录上加上命名空间xmlns时,通常使用如下的语法:
package com.blog.test; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.Namespace; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; public class Dom4jCreateXML{ public void testCreateXml() { //创建一个xml文档 Document doc = DocumentHelper.createDocument(); //向xml文件中添加注释 doc.addComment("这里是注释"); //创建一个名为students的节点,因为是第一个创建,所以是根节点,再通过doc创建一个则会报错。 Element root = doc.addElement("urlset"); root.addNamespace("xmlns","http://www.sitemaps.org/schemas/sitemap/0.9"); //在root节点下创建一个名为student的节点 Element url = root.addElement("url"); //给student节点添加一个子节点 Element loc = url.addElement("loc"); //设置子节点的文本 loc.setText("https://wwww.blog-china.cn/"); Element lastmod = url.addElement("lastmod"); lastmod.addText("2018-06-04"); //用于格式化xml内容和设置头部标签 OutputFormat format = OutputFormat.createPrettyPrint(); //设置xml文档的编码为utf-8 format.setEncoding("utf-8"); Writer out; try { //创建一个输出流对象 out = new FileWriter("E:/new.xml"); //创建一个dom4j创建xml的对象 XMLWriter writer = new XMLWriter(out, format); //调用write方法将doc文档写到指定路径 writer.write(doc); writer.close(); System.out.print("生成XML文件成功"); } catch (IOException e) { System.out.print("生成XML文件失败"); e.printStackTrace(); } } public static void main(String[] args){ Dom4jCreateXML xml = new Dom4jCreateXML(); xml.testCreateXml(); } }
当我们运行完毕后,发现文件上多了一个内容:
<?xml version="1.0" encoding="utf-8"?> <!--这里是注释--> <urlset xmlns:xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>https://wwww.blog-china.cn/</loc> <lastmod>2018-06-04</lastmod> </url> </urlset>
而图中圈出的部分并不是我们想要的
因此,我们一般想着把代码中的xmlns去掉:
root.addNamespace("","http://www.sitemaps.org/schemas/sitemap/0.9");
再次运行后,发现还不是自己想要的,居然在其他标签上也出现了xmlns命名空间,这样的方式来为某个元素节点指定缺省名称空间,这样的做法就会出现下面的问题。
<?xml version="1.0" encoding="utf-8"?> <!--这里是注释--> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url xmlns=""> <loc>https://wwww.blog-china.cn/</loc> <lastmod>2018-06-04</lastmod> </url> </urlset>
针对这个问题,网上很多资料都不正确,很多都是采用各种复杂的代码实现去除xmlns命名空间,其实有一个很简单的办法,那就是在添加xmlns命名空间时使用如下的代码:
Element root = doc.addElement("urlset","http://www.sitemaps.org/schemas/sitemap/0.9"); // root.addNamespace("","http://www.sitemaps.org/schemas/sitemap/0.9");
那就是在addElement时,传入两个参数,一个参数是要新增的节点,一个参数是命名空间的值,而把 addNamespace方法注释掉。
再次运行程序,发现结果如下:
<?xml version="1.0" encoding="utf-8"?> <!--这里是注释--> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>https://wwww.blog-china.cn/</loc> <lastmod>2018-06-04</lastmod> </url> </urlset>
哈哈,终于正常了。