题目是:写一段java程序,解析XML文档,把XML文档信息显示在页面。
<?xml version="1.0" encoding="gb2312"?>
<books>
<book email="soft">
<name color="red" size="3">test</name>
<age size="3">22</age>
</book>
</books>我已经写了个程序 ,可以把email和name 得值打印在控制台,程序如下:package com.test;import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;public class testJDom {
public testJDom(){
String xmlpath="people.xml";
SAXBuilder builder=new SAXBuilder(false);
try{
Document doc=builder.build(xmlpath);
Element books=doc.getRootElement();
List booklist =books.getChildren("book");
for(Iterator iter=booklist.iterator();iter.hasNext();){
Element book=(Element)iter.next();
String email=book.getAttributeValue("email");
System.out.println(email);
String name=book.getChildTextTrim("name");
System.out.println(name);
book.getChild("name").setText("alterrizih");
}
XMLOutputter outputter=new XMLOutputter();
outputter.output(doc, new FileOutputStream(xmlpath));
}catch(JDOMException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
public static void main(String[] args){
new testJDom();
}
}
我想问的是 该如何改能够达到题目的要求。(注:页面数据颜色,大小也要按xml要求的),
多谢各位大哥,小弟不胜感激。解答越详细越好,

解决方案 »

  1.   

    一个xml文件这个 
    <?xml version="1.0" encoding="gbk"?> 
    <Request> 
    <Ctrl> 
    <test1 type="String" length="5"> </test1 > 
    <test2 type="String" length="10"> </test2 > 
    </Ctrl> 
    <Head> 
    <test3 type="String" length="5"> </test3> 
    <test4 type="String" length="10"> </test4> 
    </Head> 
    <Body> 
    <test1 type="String" length="5"> </test1> 
    <test2 type="String" length="10"> </test2> 
    </Body> 
    </Request> 我想在程序里 对每个节点赋值 用 type  length的值来控制  
    生成的xml为 
    <?xml version="1.0" encoding="gbk"?> 
    <Request> 
    <Ctrl> 
    <test1>aaaaa </test1 > 
    <test2>aaaaaaaaaa </test2 > 
    </Ctrl> 
    <Head> 
    <test3>aaaaa </test3> 
    <test4>aaaaaaaaaa </test4> 
    </Head> 
    <Body> 
    <test1>aaaaa </test1> 
    <test2>aaaaaaaaaa </test2> 
    </Body> 
    </Request> 上面是以前回答过的一个问题, 下面是当时回答的答案, 解析和操作xml, 使用了dom4j, 希望可以帮到你, 今天没时间了, 不给你细看了.package org.aninggo.code.material.sessionfactory;import java.io.File;
    import java.io.FileWriter;
    import java.util.List;import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;public class T {    /**
         * DOM4J读写XML示例
         * 
         * @param args
         * @throws Exception
         */
        public static void main(String[] args) {
            try {
                XMLWriter writer = null; // 声明写XML的对象
                SAXReader reader = new SAXReader();            OutputFormat format = OutputFormat.createPrettyPrint();
                format.setEncoding("UTF-8"); // 设置XML文件的编码格式            String filePath = "d:\\test.xml";
                File file = new File(filePath);
                Document document = reader.read(file); // 读取XML文件
                Element root = document.getRootElement(); // 得到根节点
                boolean bl = false;
                for (Object element: root.elements()) {
                    Element p = (Element) element; //这里得到的节点是你的ctrl, head, body节点
                    List<Element> children = p.elements();
                    for(Element e: children) {
                        int length = Integer.valueOf(e.attributeValue("length")); //获取设置的长度
                        for(int j = 0; j < length; j ++) {    
                            e.setText(e.getText() + "a");
                        }
                        e.remove(e.attribute("length"));
                        e.remove(e.attribute("type"));
                    }
                }
                writer = new XMLWriter(new FileWriter(filePath), format);
                writer.write(document);
                writer.flush();
                writer.close();
                System.out.println(" 操作结束!  ");
            } catch (Exception e) {
                e.printStackTrace();
            }    }
    }
      

  2.   

    供参考private static void parseXml(String xmlPath) throws Exception {
    String path = ClassLoader.getSystemResource(xmlPath).getFile();
    File f = new File(path);
    SAXReader reader = new SAXReader();
    Document doc =  reader.read(f);
    Element root = doc.getRootElement();
    printAttribute(root);
    }
    private static void printAttribute(Element element){
    Iterator it = element.elementIterator();
    while(it.hasNext()){
    Element book=(Element)it.next();
    System.out.print(book.getName()+"\t");
    int count = book.attributeCount();
    for(int i = 0; i < count ; i ++){
    System.out.print(book.attribute(i).getName() +"->"+ book.attribute(i).getValue()+"\t");
    }
    System.out.println();
    List list = element.elements();
    for(int i = 0 ; list != null && i < list.size(); i ++){
    printAttribute((Element)list.get(i));
    }
    }
    }输出结果:
    book email->soft
    name color->red size->3
    age size->3
      

  3.   

    这是经过我测试可行的代码,楼主只要加上自己的main函数就可以了。
    public static void printNode(Element root, int j, BufferedWriter bw) throws Exception {
    // 输出开始标签前的空格
    printSapces(j, bw);
    // 输出开始标签
    printStartTagName(root, bw);
    if (root.hasChildNodes()) {
    NodeList children = root.getChildNodes();
    for (int i = 0; i < children.getLength(); i ++) {
    Node child = children.item(i);
    if (child instanceof Element) {
    int a= j + 1;
    printNode((Element)child, a, bw);
    } else if (child instanceof Text) {
    // 输出标签的值
    printTagValue(j, (Text) child, bw);
    }
    }
    // 输出结束标签前的空格
    printSapces(j, bw);
    // 输出结束标签
    printEndTagName(root, bw);
    }
    } /**
     * 输出4*j个空格. <BR>
     *
     * @param j 标签的属于第几层,从零开始计数
     * @param bw 需要写入的文件流
     * @throws Exception 异常
     */
    private static void printSapces(int j, BufferedWriter bw) throws Exception { for (int k = 0; k < 4 * j; k++) {
    System.out.print(" ");
    bw.write(" ");
    }
    } /**
     * 输出接点的开始标签. <BR>
     *
     * @param root 节点
     * @param bw 需要写入的文件流
     * @throws IOException IO异常
     */
    private static void printStartTagName(Element root, BufferedWriter bw) throws IOException {

    final String attributesStr = getAttributes(root);

    System.out.println("<" + root.getTagName() + attributesStr + ">");
    bw.write("<" + root.getTagName() + attributesStr + ">");
    bw.newLine();
    } /**
     * 输出接点的结束标签. <BR>
     *
     * @param root 节点
     * @param bw 需要写入的文件流
     * @throws IOException IO异常
     */
    private static void printEndTagName(Element root, BufferedWriter bw) throws IOException {
    System.out.println("</" + root.getTagName() + ">");
    bw.write("</" + root.getTagName() + ">");
    bw.newLine();
    } /**
     * 输出接点的值. <BR>
     *
     * @param j 需要在接点的值前打印的空格数
     * @param child 节点
     * @param bw 需要写入的文件流
     * @throws Exception 异常
     */
    private static void printTagValue(int j, Text child, BufferedWriter bw) throws Exception {
    String value = child.getData();
    if (!"".equals(value.trim())) {
    int a= j + 1;
    // 输出标签的值
    printSapces(a, bw);
    System.out.println(value);
    bw.write(value);
    bw.newLine();
    }
    } /**
     * 取得字符串的形式的节点的所有属性. <BR>
     *
     * @param node 节点
     * @return 节点的属性
     */
    private static String getAttributes(Element node) { final StringBuffer attributesStr = new StringBuffer(); if (null == node || node.getAttributes() == null) {
    return "";
    }
    NamedNodeMap attributeMap = node.getAttributes();
    for (int i = 0; i < attributeMap.getLength(); i++) {
    attributesStr.append(" ");
    Node attr = attributeMap.item(i);
    String attrName = attr.getNodeName();
    String attrValue = attr.getNodeValue();
    attributesStr.append(attrName);
    attributesStr.append("=");
    attributesStr.append("\"" + attrValue + "\"");
    }
    return attributesStr.toString();
    }
      

  4.   


    这个代码输出的是标准xml文档,楼主可以试试。
      

  5.   

    输出控制台,将你解析出来的xml在servlet中设置下面。response.setContentType("text/xml;   charset=GBK");  
      

  6.   

    输出就用response 啊!这个就看你前台需要什么?就就设定他的setContentType 酒可以了!
      

  7.   

    response.setContentType("application/pdf");
    response.getWriter().write(content);content就是你要输出的东西:比如 字符串什么的!也可以拼html这个例子是输出pdf,你也可以输出text,html等,这个你可以查查!
      

  8.   


    不是页面请求,但是输出到页面?什么情况啊?用socket,让浏览器访问你的ip可以不?
    不可以的话,你就输出到一个文件,exec它好了~~
      

  9.   

    我有个办法啊,你看看吧
    这个是解析XML的类的方法
    import java.io.File;
    import java.lang.reflect.Method;
    import java.util.Iterator;import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;public class AnalysisPageXmlObject {
        
    public Object  getPageTips(String pagename ,String language){
      
       Object obj = new Object();
       try {
              File is = new File(this.getClass().getResource("/").getPath());
              is = new File(is.getPath() + "/com/maxtie/mmis/util/pagetags.xml");
              SAXReader reader = new SAXReader();
              Document doc = reader.read(is);
              Element root = doc.getRootElement();
             
              Iterator rs = root.elementIterator("pagename");
              while(rs.hasNext()){
               Element foo= (Element)rs.next();
               if(foo.attributeValue("name").equalsIgnoreCase(pagename)){
                String classpath = foo.attributeValue("class");
                Class c = Class.forName(classpath);
                    Class types[] = new Class[1];
                    obj = c.newInstance();
                    Iterator rs1 = foo.elementIterator("tagsname");
                    while(rs1.hasNext()){
                    Element foo1= (Element)rs1.next();
                    types[0] = Class.forName("java.lang.String");
                    StringBuffer med_name = new StringBuffer("set");
                    String tags_name = foo1.attributeValue("name");
                    med_name.append(tags_name.substring(0, 1).toUpperCase());
                        med_name.append(tags_name.substring(1));
                        Method method = c.getMethod(med_name.toString(), types);
                        Iterator rs2 = foo1.elementIterator("value");
                        String tags_value="";
                        while(rs2.hasNext()){
                        Element foo2= (Element)rs2.next();
                        if(foo2.attributeValue("language").equalsIgnoreCase(language)){
                         tags_value=foo2.getText();
                        } 
                        }
                        method.invoke(obj, tags_value);  
                    }
               }
                  
              }
       } catch (Exception e) {
                              e.printStackTrace(); 
         
           }finally{
            return obj;
           }
        }
    }
    这个是缓存的类,实现对查找出来的对象的缓存
    import java.io.File;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    public class AnalysisPageXml {
    private  static Map map=new HashMap();
    public AnalysisPageXml(){  
    if(map.isEmpty()){
       try {
              File is = new File(this.getClass().getResource("/").getPath());
              is = new File(is.getPath() + "/com/mmis/util/pagetags.xml");
             
              SAXReader reader = new SAXReader();
              Document doc = reader.read(is);
              Element root = doc.getRootElement(); 
              Iterator rs = root.elementIterator("pagename");
              while(rs.hasNext()){
               List list=new ArrayList();
               Element foo= (Element)rs.next();
               String aa="";
                   aa=(String)foo.attributeValue("name");
                   map.put(aa,list);
              }       
       } catch (Exception e) {
                   e.printStackTrace(); 
           
           }finally{
           
           }
    }

    }
    String[] lan=new String[]{"ch","en","ko","fr","ge","sp","ar","jp","ru"};
    public  Object  getPageTips(String pagename ,String languag){

    /* String language=(request.getParameter("language")==null)?"ch":request.getParameter("language");
        String[] languages={"ch","jp","en","ko","ge","ru","fr","sp"};
        for(int i=0;i<languages.length;i++){
           if(language){
           
           }
        }*/
    String language=languag!=null?languag:"ch";
    String[] languages={"ch","jp","en","ko","ge","ru","fr","sp","ar"};
    boolean languageBoolean=false;
        for(int i=0;i<languages.length;i++){
           if(language.equals(languages[i])){
            languageBoolean=true;
           }
        }
        if(!languageBoolean){
         language="ch";
        }

    Object ob=null;
            
    Set set=map.keySet();
            Iterator rss=set.iterator();
            while(rss.hasNext()){
             String a=(String)rss.next();
             List  list=(List)map.get(a);
             if(a.equals(pagename)){
             if(list.isEmpty()){
             for(int i=0;i<lan.length;i++){
             TagsBean TagsBean=new TagsBean();
             TagsBean.setTagsLanguage(lan[i]);
             list.add(TagsBean);
             }
             for(int i=0;i<list.size();i++){
             TagsBean TagsBean=(TagsBean)list.get(i);
             if(TagsBean.getTagsLanguage().equals(language)){
             AnalysisPageXmlObject AnalysisPageXmlObject=new AnalysisPageXmlObject();
             ob=AnalysisPageXmlObject.getPageTips(pagename, language);
             TagsBean.setObj(ob);
             }
             }
             map.put(pagename, list);
             }else{
             for(int i=0;i<list.size();i++){
             TagsBean TagsBean=(TagsBean)list.get(i);
             if(TagsBean.getTagsLanguage().equals(language)){
             if(TagsBean.getObj()!=null){
             ob=TagsBean.getObj();
             }else{
             AnalysisPageXmlObject AnalysisPageXmlObject=new AnalysisPageXmlObject();
             ob=AnalysisPageXmlObject.getPageTips(pagename, language);
             TagsBean.setObj(ob);
             }
             }
             }
             map.put(pagename, list);
             }
             }
            
            }
    return ob;

    }

    }
    这个是缓存对象的类
    public class TagsBean {
         private String tagsLanguage;
         private Object obj;
    public Object getObj() {
    return obj;
    }
    public void setObj(Object obj) {
    this.obj = obj;
    }
    public String getTagsLanguage() {
    return tagsLanguage;
    }
    public void setTagsLanguage(String tagsLanguage) {
    this.tagsLanguage = tagsLanguage;
    }
    }
    这个是上面用反射调用的对象啊
    public class RegisterPageTagsBean { //===============================页面标签===========================================
    private String welcometags;//欢迎语句


    public String getWelcometags() {
    return welcometags;
    }
    public void setWelcometags(String welcometags) {
    this.welcometags = welcometags;
    }
    }
    这个是XML
    <?xml version="1.0" encoding="UTF-8"?> <pagetags> <!--==============注册标签===============-->
    <pagename name="registerTags" class="com.page.tagsstips.RegisterPageTagsBean">
    <tagsname name="welcometags"> 
    <value language="ch">欢迎您加入中国发展门户网国际发展名录!</value >
    <value language="en">Welcome to International Development Directory.</value >
    <value language="fr">Bienvenu à adhésion au Répertoire International du Développement </value >
    <value language="ge">Willkommen beim Firmenverzeichnis für Internationale Entwicklung! </value >
    <value language="jp">国際発展ディレクトリへようこそ!</value >
    <value language="ko">????????? ????? ?????.</value >
    <value language="ru">Приветствуем вспупить в Каталог Международного Развития! </value >
    <value language="sp">?Bienvenido al Directorio del Desarrollo Internacional! </value >
    <value language="ar"> ????? ??????  ???? ??????? ???????</value >
    </tagsname> 

    </pagename>
    </pagetags> 利用反射机制封装一个对象啊,前台调用就可以了啊中间的类实现了缓存啊,不知道我这样写你明白没,前台JSP这样写啊:
     AnalysisPageXml AnalysisPageXml=new AnalysisPageXml();
        RegisterPageTagsBean RegisterPageTagsBean=(RegisterPageTagsBean)AnalysisPageXml.getPageTips("registerTags",language);
        RegisterPageTagsBean.getWelcometags()//这样就可以得到里面的属性了,你明白了吗?