(Step 2)JDOM操作XML范例

来源:互联网 发布:mac 搭建软件开发环境 编辑:程序博客网 时间:2024/05/23 00:41
 

 这是一个示例,运行时先加入相关的API包。

需要进入的类:

import org.jdom.Attribute;
import org.jdom.Comment;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

到资源下载中下载JDOM_XML.zip 或自行到网上下载相关的包

 

注意看注释内容理解

 

/**
 * This class runs all the example code from the article.  There is a method
 * for each listing.  The listing that each method represents is listed in the
 * javadoc for the method.  This class also has a main method that will allow
 * you to execute any of the listings.  Run this class with no parameters to
 * get usage information.
 * This class was tested with:
 * xerces version 1.3.0
 * xalan version 2.0.1
 * jdom version beta6
 * jdk version 1.2
 *
 * @author Harry Evans (harry@tralfamadore.com)
 * @author Wes Biggs (wes@tralfamadore.com)
 */
public class JDomDemo {

    /**
     * Read and parse an xml document from the file at car.xml.
     * This method corresponds to the code in Listing 7.
     * @return the JDOM document parsed from the file.
     */
    public static Document readDocument() {
        try {
            SAXBuilder builder = new SAXBuilder();
            Document anotherDocument = null;
   try {
    anotherDocument = builder.build(new File("car.xml"));
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
            return anotherDocument;
        } catch(JDOMException e) {
            e.printStackTrace();
        } catch(NullPointerException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * This method creates a JDOM document with elements that represent the
     * properties of a car.
     * This method corresponds to Listing 2.
     * @return a JDOM Document that represents the properties of a car.
     */
    public static Document createDocument() {
        // Create the root element
        Element carElement = new Element("car");
        //create the document
        Document myDocument = new Document(carElement);
        //add an attribute to the root element
        carElement.setAttribute(new Attribute("vin", "123fhg5869705iop90"));

        //add a comment
        carElement.addContent(new Comment("Description of a car"));

        //add some child elements
        /*
         * Note that this is the first approach to adding an element and
         * textual content.  The second approach is commented out.
         */
        Element make = new Element("make");
        make.addContent("Toyota");
        carElement.addContent(make);
        //carElement.addContent(new Element("make").addContent("Toyota"));

        //add some more elements
        carElement.addContent(new Element("model").addContent("Celica"));
        carElement.addContent(new Element("year").addContent("1997"));
        carElement.addContent(new Element("color").addContent("green"));
        carElement.addContent(new Element("license").addContent("1ABC234").setAttribute("state", "CA"));

        return myDocument;
    }

    /**
     * This method accesses a child element of the root element of the
     * document built in listing 2 with the createDocument method.
     * This method corresponds to Listing 3.
     * @param myDocument the JDOM document built from Listing 2
     */
    public static void accessChildElement(Document myDocument) {
        //some setup
        Element carElement = myDocument.getRootElement();

        //Access a child element
        Element yearElement = carElement.getChild("year");

        //show success or failure
        if(yearElement != null) {
            System.out.println("Here is the element we found: " +
                yearElement.getName() + ".  Its content: " +
                yearElement.getText() + "/n");
        } else {
            System.out.println("Something is wrong.  We did not find a year Element");
        }
    }

    /**
     * This method removes a child element from a document.  The document
     * should be of the format created in Listing 2.
     * This method corresponds to Listin 4.
     * @param myDocument the JDOM document built from Listing 2.
     */
    public static void removeChildElement(Document myDocument) {
        //some setup
        System.out.println("About to remove the year element./nThe current document:");
        outputDocument(myDocument);
        Element carElement = myDocument.getRootElement();

        //remove a child Element
        boolean removed = carElement.removeChild("year");

        //show success or failure
        if(removed) {
            System.out.println("Here is the modified document without year:");
            outputDocument(myDocument);
        } else {
            System.out.println("Something happened.  We were unable to remove the year element.");
        }
    }

    /**
     * This method shows how to use XMLOutputter to output a JDOM document to
     * the stdout.
     * This method corresponds to Listing 5.
     * @param myDocument the JDOM document built from Listing 2.
     */
    public static void outputDocument(Document myDocument) {
        try {
            XMLOutputter outputter = new XMLOutputter("  ", true);
            outputter.output(myDocument, System.out);
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * This method shows how to use XMLOutputter to output a JDOM document to
     * a file located at xml/myFile.xml.
     * This method corresponds to Listing 6.
     * @param myDocument the JDOM document built from Listing 2.
     */
    public static void outputDocumentToFile(Document myDocument) {
        //setup this like outputDocument
        try {
            XMLOutputter outputter = new XMLOutputter("  ", true);

            //output to a file
            FileWriter writer = new FileWriter("car.xml");
            outputter.output(myDocument, writer);
            writer.close();

        } catch(java.io.IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * This method takes a JDOM document in memory, an xsl file at car.xsl,
     * and outputs the results to stdout.
     * This method corresponds to Listing 9.
     * @param myDocument the JDOM document built from Listing 2.
     * @throws IOException
     */
    public static void executeXSL(Document myDocument) throws IOException {
  try {
   TransformerFactory tFactory = TransformerFactory.newInstance();
            // Make the input sources for the XML and XSLT documents
            org.jdom.output.DOMOutputter outputter = new org.jdom.output.DOMOutputter();
            org.w3c.dom.Document domDocument = outputter.output(myDocument);
            javax.xml.transform.Source xmlSource = new javax.xml.transform.dom.DOMSource(domDocument);
            StreamSource xsltSource = new StreamSource(new FileInputStream("car.xsl"));
   //Make the output result for the finished document
            /*
             * Note that here we are just going to output the results to the
             * System.out, since we don't actually have a HTTPResponse object
             * in this example
             */
            //StreamResult xmlResult = new StreamResult(response.getOutputStream());
            FileWriter writer = new FileWriter("car.html");
            StreamResult xmlResult = new StreamResult(writer);
            //StreamResult xmlResult = new StreamResult(System.out);
   //Get a XSLT transformer
   Transformer transformer = tFactory.newTransformer(xsltSource);
   //do the transform
   transformer.transform(xmlSource, xmlResult);
        } catch(FileNotFoundException e) {
            e.printStackTrace();
        } catch(TransformerConfigurationException e) {
            e.printStackTrace();
  } catch(TransformerException e) {
            e.printStackTrace();
        } catch(org.jdom.JDOMException e) {
            e.printStackTrace();
        }
 }

    /**
     * Main method that allows the various methods to be used.
     * It takes a single command line parameter.  If none are
     * specified, or the parameter is not understood, it prints
     * its usage.
     * @throws IOException
     */
    public static void main(String argv[]) throws IOException {
            String command = "xsl";
            if(command.equals("create")) outputDocument(createDocument());
            else if(command.equals("access")) accessChildElement(createDocument());
            else if(command.equals("remove")) removeChildElement(createDocument());
            else if(command.equals("output")) outputDocument(createDocument());
            else if(command.equals("file")) outputDocumentToFile(createDocument());
            else if(command.equals("read")) outputDocument(readDocument());
            else if(command.equals("xsl")) executeXSL(createDocument());
            else {
                System.out.println(command + " is not a valid option.");
                printUsage();
            }

    }

    /**
     * Convience method to print the usage options for the class.
     */
    public static void printUsage() {
        System.out.println("Usage: Article [option] /n where option is one of the following:");
        System.out.println("  create - create a document as shown in Listing 2");
        System.out.println("  access - access a child element as shown in Listing 3");
        System.out.println("  remove - remove a child element as shown in Listing 4");
        System.out.println("  output - output a document to the console as shown in Listing 5");
        System.out.println("  file   - output a document to xml/myFile.xml as shown in Listing 6");
        System.out.println("  read   - parse a document from xml/sample.xml as shown in Listing 7");
        System.out.println("  xsl    - transform a document as shown in Listing 9");
    }
}

 

-----------------------------------------------------------------------------------------------

 

car.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<car vin="123fhg5869705iop90">
  <!--Description of a car-->
  <make>Toyota</make>
  <model>Celica</model>
  <year>1997</year>
  <color>green</color>
  <license state="CA">1ABC234</license>
</car>

 

car.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/car">
    <html>
        <head>
          <title><xsl:value-of select="make"/> <xsl:value-of select="model"/></title>
        </head>
        <body>
          <h1><xsl:value-of select="make"/></h1><br />
          <h2><xsl:value-of select="model"/></h2><br />
          <table border="0">
          <tr><td>VIN:</td><td><xsl:value-of select="@vin"/></td></tr>
          <tr><td>Year:</td><td><xsl:value-of select="year"/></td></tr>
          <tr><td>Color:</td><td><xsl:value-of select="color"/></td></tr>
          </table>
        </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

 

car.html

<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ToyotaCelica</title>
</head>
<body>
<h1>Toyota</h1>
<br>
<h2>Celica</h2>
<br>
<table border="0">
<tr>
<td>VIN:</td><td>123fhg5869705iop90</td>
</tr>
<tr>
<td>Year:</td><td>1997</td>
</tr>
<tr>
<td>Color:</td><td>green</td>
</tr>
</table>
</body>
</html>