You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by "Croci Francesco (ID)" <fc...@id.ethz.ch> on 2009/03/16 09:18:49 UTC
New to digester and need help
Hi to all,
I'm new to digester and I have the following problem (a little long but
it is all code...):
I have such an XML File to parse:
<?xml version='1.0' encoding='UTF-8'?>
<OAI-PMH xmlns='http://www.openarchives.org/OAI/2.0/'
<http://www.openarchives.org/OAI/2.0/%27>
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
<http://www.w3.org/2001/XMLSchema-instance%27>
xsi:schemaLocation='http://www.openarchives.org/OAI/2.0/
<http://www.openarchives.org/OAI/2.0/>
http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd'
<http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd%27> >
<responseDate>2009-03-12T14:00:14Z</responseDate>
<request verb="ListRecords" metadataPrefix="oai_dc"
set="2009">http://url.url.org/abc.asp <http://url.url.org/abc.asp>
</request>
<ListRecords>
<record>
<header>
<identifier>oai:oai.ethz.ch:e-collection/005583701</identifier>
<datestamp>2008-12-08</datestamp>
<setSpec>2009</setSpec>
</header>
<metadata>
<oai_dc:dc
xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/
<http://www.openarchives.org/OAI/2.0/oai_dc/>
http://www.openarchives.org/OAI/2.0/oai_dc.xsd
<http://www.openarchives.org/OAI/2.0/oai_dc.xsd> "
xmlns="http://purl.org/dc/elements/1.1/
<http://purl.org/dc/elements/1.1/> "
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
<http://www.w3.org/2001/XMLSchema-instance> "
xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/
<http://www.openarchives.org/OAI/2.0/oai_dc/> ">
<title>Universita?res Wissen teilen Forschende im Dialog
</title>
<creator>Ruegger, Hans-Ulrich </creator>
<type>text</type>
<publisher>Zuerichvdf Hochschulverlag an der ETH
Zuerich</publisher>
<date>2009</date>
<language>ger</language>
<subject>Wissenschaft</subject>
<subject>Forschung</subject>
<subject>Kooperation</subject>
<subject>Wissenstransfer</subject>
<identifier>http://url.url.url.org/blabla
<http://url.url.url.org/blabla> </identifier>
<identifier>http://url.url.url.org/blabla.pdf
<http://url.url.url.org/blabla.pdf> </identifier>
<identifier></identifier>
</oai_dc:dc>
</metadata>
</record>
...other records
</ListRecords>
</OAI-PMH>
Then I wrote my parser:
First version without rules config file
...
public ListRecordsParser() throws IOException, SAXException
{
// instantiate Digester and disable XML validation
Digester digester = new Digester();
digester.setValidating(false);
// instantiate ListRecords class
digester.addObjectCreate("OAI-PMH/ListRecords",
ListRecords.class );
// instantiate Record class
digester.addObjectCreate("OAI-PMH/ListRecords/record",
Record.class );
// instantiate Header class
digester.addObjectCreate("OAI-PMH/ListRecords/record/header",
Header.class );
digester.addBeanPropertySetter(
"OAI-PMH/ListRecords/record/header/identifier", "identifier" );
digester.addBeanPropertySetter(
"OAI-PMH/ListRecords/record/header/datestamp", "dateStamp" );
digester.addBeanPropertySetter(
"OAI-PMH/ListRecords/record/header/setSpec", "setSpec" );
digester.addSetNext( "OAI-PMH/ListRecords/record", "setHeader" );
// instantiate MetaData class
digester.addObjectCreate("OAI-PMH/ListRecords/record/metadata",
MetaData.class );
digester.addBeanPropertySetter(
"OAI-PMH/ListRecords/record/metadata/title", "title" );
digester.addBeanPropertySetter(
"OAI-PMH/ListRecords/record/metadata/creator", "creator" );
digester.addBeanPropertySetter(
"OAI-PMH/ListRecords/record/metadata/publisher", "publisher" );
digester.addSetNext( "OAI-PMH/ListRecords/record", "setMetaData"
);
digester.addSetNext( "OAI-PMH/ListRecords", "addRecord" );
File inputFile = new File("OAI.xml");
// now that rules and actions are configured, start the parsing
process
ListRecords lr = (ListRecords)digester.parse(inputFile);
log.debug("Documents list: " + lr.toString());
...
With this version I get the following error:
...
2009-03-16 09:12:07,225 [main] DEBUG
org.apache.commons.digester.Digester(org.apache.commons.digester.SetNext
Rule.end(SetNextRule.java:195)) -
[SetNextRule]{OAI-PMH/ListRecords/record} Call
ethz.oai.helper.ListRecords.setMetaData(null
--- Header ---
null
--- MetaData ---
null
)
2009-03-16 09:12:07,225 [main] ERROR
org.apache.commons.digester.Digester(org.apache.commons.digester.Digeste
r.endElement(Digester.java:1334)) - End event threw exception
java.lang.NoSuchMethodException: No such accessible method:
setMetaData() on object: ethz.oai.helper.ListRecords
at
org.apache.commons.beanutils.MethodUtils.invokeMethod(MethodUtils.java:2
14)
at
org.apache.commons.digester.SetNextRule.end(SetNextRule.java:217)
at org.apache.commons.digester.Rule.end(Rule.java:253)
at
org.apache.commons.digester.Digester.endElement(Digester.java:1332)
at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown
Source)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unk
nown Source)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDis
patcher.dispatch(Unknown Source)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unkno
wn Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown
Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown
Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown
Source)
at
org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.commons.digester.Digester.parse(Digester.java:1842)
at
ethz.oai.helper.ListRecordsParser.<init>(ListRecordsParser.java:62)
at
ethz.oai.MetaDataCollector.getDocumentsData(MetaDataCollector.java:129)
at
ethz.test.MetaDataCollectorTest.testGetMetaData(MetaDataCollectorTest.ja
va:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
a:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
Impl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethod
Runner.java:99)
at
org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRun
ner.java:81)
at
org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAf
terRunner.java:34)
at
org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.j
ava:75)
at
org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45
)
at
org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestC
lassMethodsRunner.java:66)
at
org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRu
nner.java:35)
at
org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRun
ner.java:42)
at
org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAf
terRunner.java:34)
at
org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4Tes
tReference.java:45)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.ja
va:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTe
stRunner.java:460)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTe
stRunner.java:673)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRun
ner.java:386)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRu
nner.java:196)
Second version with rules config file:
Config file:
<?xml version="1.0" encoding="UTF-8"?>
<digester-rules>
<object-create-rule pattern="OAI-PMH/ListRecords" classname="
ListRecords" />
<pattern value="OAI-PMH/ListRecords/record">
<object-create-rule classname=" Record" />
<pattern value="OAI-PMH/ListRecords/record/header">
<object-create-rule classname=" Header" />
<bean-property-setter-rule pattern="identifier"/>
<bean-property-setter-rule pattern="dateStamp"/>
<bean-property-setter-rule pattern="setSpec"/>
</pattern>
<set-next-rule methodname="setHeader" />
<pattern value="OAI-PMH/ListRecords/record/metadata">
<object-create-rule classname=" MetaData" />
<bean-property-setter-rule pattern="title"/>
<bean-property-setter-rule pattern="creator"/>
<bean-property-setter-rule pattern="publisher"/>
</pattern>
<set-next-rule methodname="setMetaData" />
</pattern>
<set-next-rule methodname="addRecord" />
</digester-rules>
Parser:
public ListRecordsParser(InputStream response) throws IOException,
SAXException
{
try
{
File inputFile = new File("OAI.xml");
File digesterRules = new File("OAIDigesterRules.xml");
boolean a = inputFile.exists();
boolean b = digesterRules.exists();
if(inputFile.exists() && digesterRules.exists())
{
Digester digester = new
DigesterLoader().createDigester(digesterRules.toURI().toURL());
// now that rules and actions are configured, start the
parsing process
ListRecords lr = (ListRecords)digester.parse(inputFile);
log.debug("Documents list: " + lr.toString());
}
}
catch (Exception e)
{
// TODO Auto-generated catch block
log.error(e.getMessage());
}
}
And with this version I get:
2009-03-16 09:14:48,008 [main] ERROR
org.apache.commons.digester.Digester(org.apache.commons.digester.Digeste
r.startElement(Digester.java:1565)) - Begin event threw exception
java.lang.ClassNotFoundException: ListRecords
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at
org.apache.commons.digester.ObjectCreateRule.begin(ObjectCreateRule.java
:205)
at org.apache.commons.digester.Rule.begin(Rule.java:175)
at
org.apache.commons.digester.Digester.startElement(Digester.java:1563)
at
org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElement(U
nknown Source)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDis
patcher.dispatch(Unknown Source)
at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unkno
wn Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown
Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown
Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown
Source)
at
org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.commons.digester.Digester.parse(Digester.java:1842)
at
ethz.oai.helper.ListRecordsParser.<init>(ListRecordsParser.java:80)
at
ethz.oai.MetaDataCollector.getDocumentsData(MetaDataCollector.java:129)
at
ethz.test.MetaDataCollectorTest.testGetMetaData(MetaDataCollectorTest.ja
va:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
a:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
Impl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethod
Runner.java:99)
at
org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRun
ner.java:81)
at
org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAf
terRunner.java:34)
at
org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.j
ava:75)
at
org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45
)
at
org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestC
lassMethodsRunner.java:66)
at
org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRu
nner.java:35)
at
org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRun
ner.java:42)
at
org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAf
terRunner.java:34)
at
org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4Tes
tReference.java:45)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.ja
va:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTe
stRunner.java:460)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTe
stRunner.java:673)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRun
ner.java:386)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRu
nner.java:196)
2009-03-16 09:14:48,008 [main] ERROR
ethz.oai.helper.ListRecordsParser(ethz.oai.helper.ListRecordsParser.<ini
t>(ListRecordsParser.java:88)) - Error at line 5 char 16: ListRecords
Can someone tell me what I miss in both cases, please?
Thanx
Francesco
Here the various objects classes:
public class ListRecords
{
/**
*
*/
private Vector<Record> records;
/**
* @param record the record to add
*/
public void addRecord(Record record)
{
if(record != null)
{
this.records.addElement(record);
}
}
/**
* @return the records
*/
public Vector<Record> getRecord()
{
return this.records;
}
public String toString()
{
String newline = System.getProperty("line.separator");
StringBuffer buf = new StringBuffer();
buf.append("--- Record ---").append(newline);
for(Record record : this.records)
{
buf.append(record).append(newline);
}
return buf.toString();
}
}
public class Record
{
/**
*
*/
private Header header;
/**
*
*/
private MetaData metaData;
/**
* @param header the header to set
*/
public void setHeader(Header header)
{
this.header = header;
}
/**
* @return the header
*/
public Header getHeader()
{
return header;
}
/**
* @param metaData the metaData to set
*/
public void setMetaData(MetaData metaData)
{
this.metaData = metaData;
}
/**
* @return the metaData
*/
public MetaData getMetaData()
{
return metaData;
}
public String toString()
{
String newline = System.getProperty("line.separator");
StringBuffer buf = new StringBuffer();
buf.append(header).append(newline);
buf.append("--- Header ---").append(newline);
buf.append(header).append(newline);
buf.append("--- MetaData ---").append(newline);
buf.append(metaData).append(newline);
return buf.toString();
}
}
public class Header
{
/**
*
*/
private String identifier;
/**
*
*/
private String dateStamp;
/**
*
*/
private String setSpec;
/**
* @return the identifier
*/
public String getIdentifier()
{
return identifier;
}
/**
* @param identifier the identifier to set
*/
public void setIdentifier(String identifier)
{
this.identifier = identifier;
}
/**
* @return the dateStamp
*/
public String getDateStamp()
{
return dateStamp;
}
/**
* @param dateStamp the dateStamp to set
*/
public void setDateStamp(String dateStamp)
{
this.dateStamp = dateStamp;
}
/**
* @return the setSpec
*/
public String getSetSpec()
{
return setSpec;
}
/**
* @param setSpec the setSpec to set
*/
public void setSetSpec(String setSpec)
{
this.setSpec = setSpec;
}
public String toString()
{
String newline = System.getProperty("line.separator");
StringBuffer buf = new StringBuffer();
final String TAB = " ";
buf.append("Header ( ");
buf.append("identifier = ").append(this.identifier).append(TAB);
buf.append("dateStamp = ").append(this.dateStamp).append(TAB);
buf.append("setSpec = ").append(this.setSpec).append(TAB);
buf.append(" )").append(newline);
return buf.toString();
}
}
public class MetaData
{
/**
*
*/
private String title;
/**
*
*/
private String creator;
/**
*
*/
private String publisher;
/**
* @return the title
*/
public String getTitle()
{
return title;
}
/**
* @param title the title to set
*/
public void setTitle(String title)
{
this.title = title;
}
/**
* @return the creator
*/
public String getCreator()
{
return creator;
}
/**
* @param creator the creator to set
*/
public void setCreator(String creator)
{
this.creator = creator;
}
/**
* @return the publisher
*/
public String getPublisher()
{
return publisher;
}
/**
* @param publisher the publisher to set
*/
public void setPublisher(String publisher)
{
this.publisher = publisher;
}
public String toString()
{
String newline = System.getProperty("line.separator");
StringBuffer buf = new StringBuffer();
final String TAB = " ";
buf.append("MetaData ( ");
buf.append("title = ").append(this.title).append(TAB);
buf.append("creator = ").append(this.creator).append(TAB);
buf.append("publisher = ").append(this.publisher).append(TAB);
buf.append(" )").append(newline);
return buf.toString();
}
}