Чтение, обновление проблемы с библиотекой 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 для создания файла dtd из моего созданного XML. все хорошо работает при написании части.. Но чтение проклинает меня. Я полагаю, что с моим 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 ответ
Это не имеет никакого отношения к вашему DTD. Вам нужно включить jaxen в ваш путь к классам. Jaxen - это механизм xpath, используемый dom4j для оценки выражений xpath. Jaxen является частью дистрибутива dom4j.