当前位置: 首页 > 工具软件 > JDOM > 使用案例 >

JDOM遍历程序

解晟睿
2023-12-01

完整程序:  
 
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.csdn.net/it_man/article/details/757864


 类似资料: