欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDOM操作XML文档高级篇XML验证,创建带名字空间的xml, xml文档的修改

程序员文章站 2022-03-03 17:42:24
...
下面我通过几个例子来实现JDOM来操作XML文档:

1、 xml文档的验证 DTD 我们经常使用XML来验证文档的合法性。

我们需要在xml的开头引入 <!DOCTYPE rootNameSYSTEM "xxx.dtd"> 这里的PUBLIC 引入的是私有DTD也就是我们自己定义的 。我们平时使用这种即可 。

另一种是 <!DOCTYPE rootName PUBLIC ".........">这个是ISO标准的DTD ,是已经定义好了的 具体DTD 我们可以根据ISO的提供引入。

注意<!DOCTYPE之间不要有空格 。下面是代码 具体的xml和 dtd文件自己去定义吧。

<%@ page import="org.jdom2.*,org.jdom2.output.*,java.io.*,java.util.*" %>

<% SAXBuilder builder=new SAXBuilder() ; //构建XML解析器 builder.setValidation(true) ; //设置解析器为验证DTD builder.build("d:/student.xml") ; //解析XML ,解析的时候会自动根据我们xml文件中的DOCTYPE声明的DTD文件来验证 if(builder.isValidating()) //检查解析结果 是否为true { out.print("验证通过!"); } %>


2、建立一个带名字空间的xml文档 。。。


<%

Element root=new Element("root"); //定义根元素
Document myDocument=new Document(root) ; //定义文档对象
Namespace namespace1=Namespace.getNamespace("qingdaodaxue") ; //定义青岛大学名字空间
Element student1=new Element("student"); //root的子元素
Element name1=new Element("name") ; //student的子元素
Element age1=new Element("age"); //..
Element sex1=new Element("sex"); //..
Element id1=new Element("id");//..
student1.setNamespace(namespace1) ; //增加节点以及子节点到 名字空间 无前缀
name1.setNamespace(namespace1); //...
age1.setNamespace(namespace1 ) ; //同上
sex1.setNamespace(namespace1 ) ;
id1.setNamespace(namespace1) ;


name1.setText("zhangsan") ; //同上
age1.setText("15") ;
sex1.setText("man") ;
id1.setText("1");
student1.addContent(name1) ;
student1.addContent(age1) ;
student1.addContent(sex1) ;
student1.addContent(id1);

Element student2=new Element("student");
Element name2=new Element("name") ;
Element age2=new Element("age");
Element sex2=new Element("sex");
Element id2=new Element("id");
Namespace namespace2=Namespace.getNamespace("qingdaokejidaxue");
student2.setNamespace(namespace2) ;
id2.setNamespace(namespace2);
age2.setNamespace(namespace2 ) ;
sex2.setNamespace(namespace2 ) ;
name2.setNamespace(namespace2) ;
name2.setText("lisi") ;
age2.setText("16") ;
sex2.setText("woman") ;
id2.setText("2");
student2.addContent(name2) ;
student2.addContent(age2) ;
student2.addContent(sex2) ;
student2.addContent(id2);

root.addContent(student1) ;
root.addContent(student2) ;


Format format=Format.getPrettyFormat() ;
format.setEncoding("gb2312") ;
XMLOutputter output=new XMLOutputter(format);
OutputStream fos=new FileOutputStream("d:/info.xml");
output.output(myDocument, fos) ;
fos.close() ;


%>

3、在上述xml文档中查询 namespace1 也就是 qingdaodaxue的这个名字空间 的内容输出各个子节点的内容 并将name的内容改为modify。

 
 SAXBuilder builder=new SAXBuilder() ;
 Document myDocument=builder.build("d:/info.xml") ; 
 List list=myDocument.getRootElement().getChildren() ; 
 for(Object obj:list)
 {
  Element el=(Element)obj ;
  if(el.getNamespaceURI().equals("qingdaodaxue"))
  {
  List tem=el.getChildren() ;
  for(Object temObj:tem) 
  { 
  Element temEl=(Element)temObj ;
  out.print(temEl.getName()+":"+temEl.getText()+"<br>");
  if(temEl.getName().equals("name"))
  {
  temEl.setText("modify") ;
  }
  }
  }
 }
 
 Format format=Format.getPrettyFormat() ;
 format.setEncoding("gb2312") ;
 XMLOutputter output=new XMLOutputter(format);
 OutputStream fos=new FileOutputStream("d:/info.xml"); 
 output.output(myDocument, fos) ;
 fos.close() ;