[XOM-interest] Is XOM an appropriate tool for this task?
Jean Pierre Malrieu
jp.malrieu at free.fr
Mon Jun 11 08:31:56 EDT 2007
Hi,
Again, keep in mind I am a xml beginner.
I have to parse and retrieve the information from xml documents which
are an awful mixture of "real" xml and text.
Until now I was using xmlBeans to do it. But as the schema of the xml
documents redefines the whole XHTML, and introduces many intermediate
types, xmlBeams produces 9 MB of jars! There are several versions of
the schema, so the xmlBeans approach has to be abandonned (although
it worked): I can't add this amount of jars to my app every-time a
new schema comes out.
I need to walk the xml with some sort of cursor (like the xmlCursor
in xmlBeans). I don't think there is another way of doing given the
amount of text or xhtml spread all around, and at any level... But I
may be wrong.
To give you an idea of what I was doing with xmlbeans:
Basically, I am building the xhtmlStr string, except when dealing
with really structured data, that I map to my own data structures
(not shown here).
private void processToken(XmlCursor curs, AssessmentItemType aType)
throws QTIException {
switch (curs.currentTokenType().intValue()) {
case TokenType.INT_START:
String elementName = curs.getName().getLocalPart();
// deal with really structured xml first
if ( isStructuredData(elementName) )
ProcessStructuredData(elementName) );
// if the content is a mixture of text and xhtml keep a stack of
xhtml tags
else {
xhtmlStr = xhtmlStr.concat("<" + elementName + ">");
poppedNames.addObject(elementName);
}
break;
// append text to a string
case TokenType.INT_TEXT:
xhtmlStr = xhtmlStr.concat(curs.getTextValue());
break;
// closes the xhtml tag and remove the tag from the stack
case TokenType.INT_END:
String lsStr = (String)poppedNames.lastObject();
if ( !( "null".equals(lsStr) || "itemBody".equals(lsStr) ) )
xhtmlStr = xhtmlStr.concat( "</" + poppedNames.lastObject() + ">");
poppedNames.removeLastObject();
break;
// deal with attributes
case TokenType.INT_ATTR:
if ( curs.getName() != null ) {
xhtmlStr = xhtmlStr.substring(0,xhtmlStr.length() -1);
// Modify some attributes before copying them
if (curs.getName().getLocalPart().equals("src") )
xhtmlStr = xhtmlStr.concat(" src" + "=\"/QTI/" +
curs.getTextValue() + "\">");
// or just copy them as they are
else
xhtmlStr = xhtmlStr.concat(" " + curs.getName().getLocalPart()
+ "=\"" + curs.getTextValue() + "\">");
}
break;
}
}
What tool would you recommend to do this kind of xml walking? Is
there something equivalent in XOM? In another API? Is there a much
better way of doing what I want? I just figured this method out of my
inexistent knowledge of xml... What would you recommend?
Thanks.
JPM
More information about the XOM-interest
mailing list