阅读,更新dom4j库的问题

时间:2011-08-25 10:03:24

标签: xml dtd dom4j

这是我编写xml文件的代码:

public void generateDocument(){
        Document document = DocumentHelper.createDocument();
             Element catalogElement = document.addElement("catalog");
             catalogElement.addComment("An XML Catalog");
             catalogElement.addProcessingInstruction("target","text");
             Element journalElement =  catalogElement.addElement("journal");
             journalElement.addAttribute("title", "XML Zone");
             journalElement.addAttribute("publisher", "IBM developerWorks");


             Element articleElement=journalElement.addElement("article");
             articleElement.addAttribute("level", "Intermediate");
             articleElement.addAttribute("date", "December-2001");
             Element  titleElement=articleElement.addElement("title");
             titleElement.setText("Java configuration with XML Schema");
             Element authorElement=articleElement.addElement("author");
             Element  firstNameElement=authorElement.addElement("firstname");
             firstNameElement.setText("Marcello");
             Element lastNameElement=authorElement.addElement("lastname");
             lastNameElement.setText("Vitaletti");
                //pass this xml document
             DTDGenerator dtd=new DTDGenerator(document,"catalog.dtd");
             document.addDocType("catalog",
                                 null,"catalog.dtd");
            try{
            XMLWriter output = new XMLWriter(
                    new FileWriter( new File("catalog.xml") ));
                output.write( document );
                output.close();

                }
             catch(IOException e){System.out.println(e.getMessage());}

        }

我的阅读代码是:

public static void modifyDocument(File inputXml){

          try{
           SAXReader saxReader = new SAXReader();
           Document document = saxReader.read(inputXml);

           List list = document.selectNodes("//article/@level" );
           Iterator iter=list.iterator();
           while(iter.hasNext()){
            Attribute attribute=(Attribute)iter.next();
            if(attribute.getValue().equals("Intermediate"))
              attribute.setValue("Introductory"); 

               }

           list = document.selectNodes("//article/@date" );
           iter=list.iterator();
           while(iter.hasNext()){
            Attribute attribute=(Attribute)iter.next();
            if(attribute.getValue().equals("December-2001"))
              attribute.setValue("October-2002");

               }

           list = document.selectNodes("//article" );
           iter=list.iterator();
           while(iter.hasNext()){
            Element element=(Element)iter.next();
            Iterator iterator=element.elementIterator("title");
              while(iterator.hasNext()){
                Element titleElement=(Element)iterator.next();
                if(titleElement.getText().equals("Java configuration with XML Schema"))
                titleElement.setText("Create flexible and extensible XML schema");

                  }

                                        }

            list = document.selectNodes("//article/author" );
            iter=list.iterator();
             while(iter.hasNext()){
             Element element=(Element)iter.next();
             Iterator iterator=element.elementIterator("firstname");
             while(iterator.hasNext()){
              Element firstNameElement=(Element)iterator.next();
              if(firstNameElement.getText().equals("Marcello"))
              firstNameElement.setText("Ayesha");
                                             }

                                      }

            list = document.selectNodes("//article/author" );
            iter=list.iterator();
             while(iter.hasNext()){
              Element element=(Element)iter.next();
              Iterator iterator=element.elementIterator("lastname");
             while(iterator.hasNext()){
              Element lastNameElement=(Element)iterator.next();
              if(lastNameElement.getText().equals("Vitaletti"))
              lastNameElement.setText("Malik");

                                          }

                                       }
             XMLWriter output = new XMLWriter(
              new FileWriter( new File("catalog-modified.xml") ));
             output.write( document );
             output.close();
           }

          catch(DocumentException e)
                         {
                          System.out.println(e.getMessage());
                                    }

          catch(IOException e){
                               System.out.println(e.getMessage());
                            }
         }

我正在使用dom4j库并且还借助DTDGenerator从我创建的xml生成dtd文件。写作部分的一切都很好。但是读书正在诅咒我。我相信我的DTD有问题..但我的输出dtd看起来相当令人印象深刻..但没有帮助阅读xml :( .. 我的Dtd输出:

<!ELEMENT article ( title, author ) >
<!ATTLIST article date NMTOKEN #REQUIRED >
<!ATTLIST article level NMTOKEN #REQUIRED >

<!ELEMENT author ( firstname, lastname ) >

<!ELEMENT catalog ( journal ) >

<!ELEMENT firstname ( #PCDATA ) >

<!ELEMENT journal ( article ) >
<!ATTLIST journal publisher CDATA #REQUIRED >
<!ATTLIST journal title CDATA #REQUIRED >

<!ELEMENT lastname ( #PCDATA ) >

<!ELEMENT title ( #PCDATA ) >

我的Xml文件是:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE catalog SYSTEM "catalog.dtd">
-<catalog>
<!--An XML Catalog-->

<?target text?>
-<journal title="XML Zone" publisher="IBM developerWorks">-<article date="December-2001" level="Intermediate"><title>Java configuration with XML Schema</title>-<author><firstname>Marcello</firstname><lastname>Vitaletti</lastname></author></article></journal></catalog>

,错误是:

Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
    at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)
    at org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)
    at org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164)
    at com.xmlsample.XMLSampleRead.modifyDocument(XMLSampleRead.java:35)
    at com.xmlsample.XMLSampleRead.main(XMLSampleRead.java:24)
Caused by: java.lang.ClassNotFoundException: org.jaxen.JaxenException
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 5 more

1 个答案:

答案 0 :(得分:0)

这与您的DTD无关。您需要在类路径中包含jaxen。 Jaxen是dom4j在评估xpath表达式时内部使用的xpath引擎。 Jaxen是dom4j发行版的一部分。