完整程序:
package jdom;
import java.io.File;
import java.util.List;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
public class JDOM
{
private static StringBuffer strbuf = new StringBuffer();
/**
* main
*
* @param argv String
*/
public static void main(String[] argv)
{
if(argv.length == 0 ¦ ¦ (argv.length == 1 && argv[0].equals("-help")))
{
System.out.println("Usage:java JDOM uri");
System.exit(1);
}
try
{
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(new File(argv[0]));
Element root = doc.getRootElement();
//System.out.println(doc.getBaseURI());
strbuf.append("<?xml version=/"1.0/" encoding=/"GB2312/"?>").append(System.getProperty("line.separator"));
strbuf.append("<");
strbuf.append(root.getName());
if(!"".equals(root.getNamespaceURI())) //Namespace信息
{
strbuf.append(" xmlns=/"" + root.getNamespaceURI() + "/"");
}
//得到附加的Namespace,比如:xmlns:xsi
accessAdditionalNamespaces(root);
//得到附加的Namespace的属性,如:xsi:schemaLocation
accessAttribute(root);
strbuf.append(">");
//遍历节点!
accessElement(root);
strbuf.append("</" + root.getName() + ">");
System.out.println(strbuf.toString());
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* accessElement
* 遍历结点
* @param parent Element
*/
public static void accessElement(Element parent)
{
List listChild = parent.getChildren();
int iChild = listChild.size();
for(int i = 0;i < iChild;i++)
{
Element e = (Element)listChild.get(i);
strbuf.append(System.getProperty("line.separator"));
strbuf.append("<");
strbuf.append(e.getName());
//访问属性
accessAttribute(e);
strbuf.append(">");
strbuf.append(e.getTextTrim());
//递归访问节点
accessElement(e);
strbuf.append("</");
strbuf.append(e.getName());
strbuf.append(">");
}
//恰当换行成XML原有的格式
if(iChild > 0)
{
strbuf.append(System.getProperty("line.separator"));
}
}
/**
* accessAttribute
* 访问结点的属性
* @param e Element
*/
public static void accessAttribute(Element e)
{
List listAttributes = e.getAttributes();
int iAttributes = listAttributes.size();
for(int j = 0;j < iAttributes;j++)
{
Attribute attribute = (Attribute)listAttributes.get(j);
//问题:属性带有命名空间xsi:的怎么处理?
//<name xsi:type="Full">YuLimin</name>
// + attribute.getNamespacePrefix() + ":"
strbuf.append(" ");
String strNS = attribute.getNamespace().getPrefix();
if(!"".equals(strNS))
{
strbuf.append(strNS).append(":");
}
strbuf.append(attribute.getName() + "=/"" + attribute.getValue() + "/"");
}
}
/**
* accessAdditionalNamespaces
* 访问附加的命名空间
* @param e Element
*/
public static void accessAdditionalNamespaces(Element e)
{
List listAdditionalNamespaces = e.getAdditionalNamespaces();
int iAttributes = listAdditionalNamespaces.size();
for(int j = 0;j < iAttributes;j++)
{
Namespace namespace = (Namespace)listAdditionalNamespaces.get(j);
strbuf.append(" xmlns:" + namespace.getPrefix() + "=/"" + namespace.getURI() + "/"");
}
}
}
XML文件内容
<?xml version="1.0" encoding="GB2312"?>
<specificationSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.citi.qut.edu.au/yawl YAWL_Schema.xsd" xmlns="http://www.citi.qut.edu.au/yawl" xmlns:mm="www.citi.qut.edu.au/yawl/exampleSchemas/make_trip">
<specification uri="Maketrip1.ywl">
<metaData/>
<decomposition id="pay" xsi:type="问题在这里!如何处理带有命名空间的属性?">
<inputParam name="customer">
<type>xs:string</type>
</inputParam>
<inputParam name="payment_account_number">
<type>xs:string</type>
</inputParam>
<inputParam name="carDetails">
<type>xs:string</type>
</inputParam>
<inputParam name="hotelDetails">
<type>xs:string</type>
</inputParam>
<inputParam name="flightDetails">
<type>xs:string</type>
</inputParam>
</decomposition>
</specification>
</specificationSet>
2. Element类的getContent()方法返回一个List对象,它包括了一个元素的所有内容:注释、属性、处理指令、文本和子元素。利用它我们可以遍历XML文档。下面的程序来自《java语言与xml教程》
import org.jdom.*;
import org.jdom.input.SAXBuilder;
import java.io.IOException;
import java.util.*;
public class TreePrinter{
public static void process(Element element){
inspect(element);
List content=element.getContent();//取元素的所有内容
Iterator iterator=content.iterator();
while(iterator.hasNext()){
Object o=iterator.next();
if(o instanceof Element){//如果是子元素
Element child=(Element)o;
process(child);//递归调用
}else if(o instanceof Comment){//如果是说明
Comment c=(Comment)o;
//System.out.println(c.getText());
// System.out.println();
}
}
public static void inspect(Element element){
if(!element.isRootElement()){
System.out.println();
}
String qualifiedName=element.getQualifiedName();
System.out.println(qualifiedName+":"+element.getText());
Namespace namespace=element.getNamespace();
if(namespace!=Namespace.NO_NAMESPACE){
String localName=element.getName();
String uri=element.getNamespaceURI();
String prefix=element.getNamespacePrefix();
System.out.println(" Local name: "+localName);
System.out.println(" Namespace URI: "+uri);
if(!"".equals(prefix)){
System.out.println(" Namespace prefix: "+prefix);
}
}
List attributes=element.getAttributes();
if(!attributes.isEmpty()){
Iterator iterator=attributes.iterator();
while(iterator.hasNext()){
Attribute attribute=(Attribute)iterator.next();
String name=attribute.getName();
String value=attribute.getValue();
Namespace attributeNamespace=attribute.getNamespace();
if(attributeNamespace==Namespace.NO_NAMESPACE){
System.out.println(" "+name+ "=/""+value+ "/"");
}else{
String prefix=attributeNamespace.getPrefix();
System.out.println(" "+prefix+":"+name+"=/""+value+"/"");
}
}
}
List namespaces=element.getAdditionalNamespaces();
if(!namespaces.isEmpty()){
Iterator iterator=namespaces.iterator();
while(iterator.hasNext()){
Namespace additional=(Namespace)iterator.next();
String uri=additional.getURI();
String prefix=additional.getPrefix();
System.out.println(" xmlns:"+prefix+"=/""+uri+"/"");
}
}
}
public static void main(String[] args){
if(args.length<=0){
System.out.println("Usage: java TreePrinter URL");
return;
}
String url=args[0];
try{
SAXBuilder parser=new SAXBuilder();
Document document=parser.build(url);
process(document.getRootElement());
}catch(JDOMException e){
System.out.println(url+" is not well-formed.");
}catch(IOException e){
System.out.println("Due to an IOException,the parser could not encode "+url);
}
}
}
运行结果:
C:/java>java TreePrinter sample.xml
HD:
xmlns:dd="http://www.zzjava.hnzz.net"
xmlns:ss="http://www.hnzz.net"
disk:
name="C"
capacity:8G
directories:200
files:1580
disk:
name="D"
capacity:10G
directories:500
files:3000
用的xml文件是:
<?xml version="1.0" encoding="UTF-8"?>
<HD xmlns:dd="http://www.zzjava.hnzz.net" xmlns:ss="http://www.hnzz.net" >
<disk name="C">
<capacity>8G</capacity>
<directories>200</directories>
<files>1580</files>
</disk>
<disk name="D">
<capacity>10G <!--good-->
</capacity>
<directories>500</directories>
<files>3000</files>
</disk>
</HD>
原文链接:http://blog.youkuaiyun.com/it_man/article/details/757864