SAX Parser Validation Bug or.....
I'm using Oracle XML Parser 2.0.1.0.0 for C Programming.
I found that the parser cannot provide validation function when it use the SAX parser.
I try to use a different tag name between the data. It also can pass the parser
example:<nam>John<name>
As W3C XML 1.0 standard, All data must be pack by a pair of SAME tag.
Is it a limitation or bug of SAX parser ?
Thanks
Sanjaya
null
Hi,
This is indeed a bug in our parser. It has been fixed and will be available in OTN with the next release.
Thank you,
Oracle XML Team
Similar Messages
-
SAX Parser Validation with Schemas (C, C++ and JAVA)
We are currently using the Oracle XML Parser for C to parse and validate XML data using the SAX parser interface with validation turned on. We currently define our XML with a DTD, but would like to switch to schemas. However, the Oracle XML Parser 9.2.0.3.0 (C) only validates against a DTD, not a schema when using the SAX interface. Are there plans to add schema validation as an option? If so, when would this be available? Also, the same limitation appears to be true for C++ and JAVA. When will any of these provide SAX parsing with schema validation?
Thanks!
JohnWill get back to you after checked with development team...
-
Sax parse xml bug , I can't figure it out!
(1) orginal xml file as followings:
<row>
<field name="productBundleId">22456</field>
<field name="localPath">/products/01092008/RealArcade/STD_StonesOfKhufu_NOK6030_EN_v1_0_12.jar</field>
<field name="description">/products/01092008/RealArcade/STD_StonesOfKhufu_NOK6030_EN_v1_0_12.jad</field>
</row>
(2) task parsing the above and and retrieve the value and set it to a javabean:
(3) Using the SAX as the xml file is very big , about 1M
* @author mertef
public class XerseHandlerImp extends DefaultHandler implements MF_CONSTANTS
List m_data = new ArrayList();
private CompareSimpleBean m_csb = null;
private String m_tmpVal = "";
private boolean m_id = false;
private boolean m_jar = false;
private boolean m_jad = false;
private String m_whitespace = "";
private boolean m_character = false;
@Override
public void characters(char[] ch, int start, int length) throws SAXException
* // System.out.println(new String(ch,start,length));*
m_tmpVal = new String(ch, start, length);*
if (jad) System.out.println(tmpVal);*
@Override
public void endElement(String uri, String localName, String name) throws SAXException
m_character = false;
if (name.equals(MOVAYA_ROW))
m_data.add(m_csb);
if (name.equals(MOVAYA_FIELD))
if (m_id)
m_csb.setId(m_tmpVal);
m_id = false;
m_jar = false;
m_jad = false;
else if (m_jar)
m_csb.setJarPath(m_tmpVal);
m_id = false;
m_jar = false;
m_jad = false;
else if (m_jad)
m_csb.setJadPath(m_tmpVal);
m_id = false;
m_jar = false;
m_jad = false;
@Override
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException
m_whitespace = new String(ch, start, length);
(4) please pay attention to the bold area , the method:
character()
I declare a variable "m_character" to decide if the parser don't read content of
an item in above xml file ,such as
/products/01092008/RealArcade/STD_StonesOfKhufu_NOK6030_EN_v1_0_12.jar
(5)error:
but some time it only reads part of the character contents:
eg:
/products/01092008/RealAr
cade/STD_StonesOfKhufu_UnitedStates_LGCU515_EN_v1_0_12.jad
It means that they parser comes across some character when parsing,
but in fact it doesn't.
You can use println() to monitor the outputs.
So I need to declare some boolean variable to decide whether all the content of one item has read fully.
(6)
May be its a bug, my xml file don't include any special charactor.The problem is that the character data might be delivered in multiple chunks, this means that the characters method might be called more than once for the same element.
One way around this is to create a StringBuilder or something similar in the startElement() method, and fill it with the characters in the characters() method and read it in the endElement() method.
For more information: http://forum.java.sun.com/thread.jspa?threadID=5255925 -
Fatal error XML-0121 in a valid XML file in v2 of SAX parser
Attachments: "1|type=text/plain|desc=Logging of Fatal error using v2 of SAX parser |file=v2_loggin
.txt|";"2|type=text/plain|desc=Logging of Fatal error using v2 of java SAX parser |17078|file=v2_l
gging.txt|"
Dear XML team,
I am using the SAX parser version 2.0.2.4. When parsing a valid
XML of approx. 3,5 Megabytes i get a fatal error XML-0121
saying 'End tag does not match start tag
<CORRESPONDENTIENAAM1>...'
We checked the xml on the well formedness with tools like XML
Spy and IE5. The XML is valid!
We did some testing on the XML with the SAXSample class and we
noticed that the error is related to the use of Entity
References. When we removed the Entity Reference ' the XML
was parsed correctly.
We also noticed that if we cut the XML in two smaller parts it
was also parsed correctly.
I attached the output of the parser, as well as the output of
the SAXSample class.
I hope you can fix this problem!
With kind regards,
Rolf van Deursen.
nullUpdate: I have attempted to use xmlparserv2.jar dated 12/23/08 that is packaged with jDeveloper 11g preview, but am still receiving the same message.
-
Error in SAX using validating parser
I am using the SAX parser and I am getting an "s4s-elt-schema-ns" error trying to validate xml before parsing it. Please note that my xml schema file specifies a "xsi:noNamespaceSchemaLocation" file. Does anyone have any ideas?
Thanks - twins.fan
The error is follows:
=============
SystemID file:///G:/VendorIndependent/homebaseOverrides.xml
Line Number - 2
Column Number - 119
Message - s4s-elt-schema-ns: The namespace of element 'Overrides' must be from the schema namespace, 'http://www.w3.org/2001/XMLSchema'.
==============
The first few lines of the xml schema file is:
==========
<?xml version="1.0" encoding="US-ASCII"?>
<Overrides xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="overrideValidate.xsd">
<Property hotelID="46777">
<Override>
<City Value="Curacao"/>
<Confirmation> <City Value="Cura??Ao"/> </Confirmation>
</Override>
</Property>
==============My problems is solved after importing fix pack 4 for websphere 3.5.
Regards,
Lee -
Validating xml file against a specific schema using jaxp sax parser
Hi,
I would like to validate a soap xml given below
<?xml version="1.0" encoding="UTF-8"?>
<Envelope>
<Body>
<name>pavan</name>
<number>123</number>
</Body>
</Envelope>
to validate against the schema of soap from url "http://www.w3.org/2003/05/soap-envelope". I dont want to have this namespace in the xml. How can I validate against the specified schema using jaxp sax parser?
Please help.
Thanks,
T.Pavan kumarAny one, please help.
-
SAX parser doesn't report IDREF type
I have been trying to create my first DTD:
<!ELEMENT Network (Node+, Link*)>
<!ELEMENT Node EMPTY>
<!ATTLIST Node
ID ID #REQUIRED
title CDATA #IMPLIED>
<!ELEMENT Link EMPTY>
<!ATTLIST Link
source IDREF #REQUIRED
dest IDREF #REQUIRED
title CDATA #IMPLIED>
and would expect that the source and dest attributes of the
Link element would have the type IDREF when being parsed with
the SAX parser. Using the SAXSample.java provided I get the
following output for a test network:
StartElement:Network
IgnorableWhiteSpace
StartElement:Node
ID(ID)=node1
title(CDATA)=test node
EndElement:Node
IgnorableWhiteSpace
StartElement:Node
ID(ID)=node2
title(CDATA)=another node
EndElement:Node
IgnorableWhiteSpace
StartElement:Link
source(CDATA)=node2
dest(CDATA)=node1
EndElement:Link
IgnorableWhiteSpace
StartElement:Link
source(CDATA)=node1
dest(CDATA)=node2
EndElement:Link
IgnorableWhiteSpace
EndElement:Network
This clearly shows source and dest reported as CDATA type. Not
exactly what's in the DTD.
Is this an undocumented feature (a.k.a. bug?)
Regards,
Gary Howard.
Smart Network Technology,
Nortel Networks, UK
nullThanks for the replies, but I don't think we are quite connecting. I do eventually want to be able to validate an XML file against a schema (which I can't do either), but first I want to be able to validate the schema file itself; i.e. to confirm that the schema I designed is a valid schema file. As I understand it, it should be possible to tell the parser that the schema to validate against is the "schema for writing schemas", http://www.w3.org/Schema/schema.xsd (or whatever it is). That's where I'm getting stuck, that the parser doesn't recognize the elements for actually defining a schema.
-
SAX Parser throws NullPointerException
Hi.
I'm using WLS6.1 SP1 built-in XML SAX parser. The code is like,
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader parser = factory.newSAXParser().getXMLReader();
// Add a error handler
eh = new MyErrorHandler();
parser.setErrorHandler(eh);
parser.setContentHandler(this);
// Enable namespace
parser.setFeature("http://xml.org/sax/features/namespaces", true);
// Enable validation
parser.setFeature("http://xml.org/sax/features/validation", false);
parser.parse(new InputSource(in));
The NullPointerException is thrown at -
org.apache.xerces.framework.XMLParser.parse(XMLParser.java:965)
after the end element of (</eb:MessageHeader>) before the start element of <SOAP-ENV:Header>.
The XML file is attached.
=====================================
However, I tried to parse this document on xerces parser 131.
It worked fine.
=====================================
Did I miss any thing? It seems like a bug to me.
Thanks!
[header.xml]SAX should mask the fact that some content is specified inside of a CDATA section.. It is just characters.
The safest way to process characters is to setup a StringBuffer or equivalent in the startElement method. There is a variation of the StringBuffer append method that has the same three parameters (char[], int, int) as the characters signature. The characters method may be called many times before you are given all of the content of the string. How it decides when to call you depends on the parser and is subject to change over time. But, if you accumulate the contents in each call of characters and do the toString() in the endElement method you are going to get the right content. Lots of people over the last year or so that I've been involved in this forum have had other ways they thought were better than this, but most of them have eventually tried and accepted this way because it works and their "better" way did not.
It looks like you got the content for the CDATA section (Please refer...).I'm not sure what your problem is.
Dave Patterson -
Why are all the events in the XML SAX parser not activated?
Hi everyone,
I have written a mini server that parses XML files into SQL queries.
Below is a segment of my code;
try {
Class.forName( JDBC_DRIVER );
myConnection = DriverManager.getConnection( DATABASE_URL, "username", "password");
EventXMLParser myEXP = new EventXMLParser(directory, myConnection);
File[] xmlFiles = directory.listFiles();
for (File xmlFile : xmlFiles) {
myEXP.XMLtoDB(xmlFile);
outWriter.println("File:" + xmlFile.getName() + " DONE");
} catch (SQLException e) {
System.err.println("SQLException for establishing connection");
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.err.println("CLASS NOT FOUND EXCEPTION HERE");
e.printStackTrace();
} catch (Exception e) {
System.err.println(e);
e.printStackTrace();
finally {
outWriter.println("PARSING COMPLETED");
outWriter.close();
}Where the constructor EventXMLParser constructs the following:
public EventXMLParser(File path, Connection connection) {
super();
try {
this.XMLpath = path;
this.db_connection = connection;
this.xr = XMLReaderFactory.createXMLReader();
this.XMLSAXhandler = new DefaultHandler(); //create a new own handler
this.xr.setContentHandler(XMLSAXhandler);
this.xr.setErrorHandler(XMLSAXhandler);
//System.out.println("DEBUG: db_connection is " + db_connection.toString());
catch (Exception e) {
System.out.println("Constructor Error!");
e.printStackTrace();
}Below are all my helper methods within EventXMLParser.java
public void XMLtoDB(String XMLpath) throws Exception {
try {
//Input
System.out.println("XMLpath is : " + XMLpath);
/*FileReader r = new FileReader(XMLpath); debug
InputSource in = new InputSource(r);
xr.parse(in);
xr.parse(XMLpath);
/* Note that while parsing, the end of each event, </event>
* will trigger sendSQL to execute the query on the database
catch (Exception e) {
throw new Exception("Error with XMLtoDB!! Exception: " + e);
public void sendSQL(Event event, Connection sql_connection) throws SQLException {
//JDBC part
try {
System.err.println("DEBUG sendSQL");
Statement sql_statement = sql_connection.createStatement();
ResultSet resultSet = sql_statement.executeQuery( event.toSQL() );
catch (SQLException e) {
e.printStackTrace();
/* Parsing XML
* From here onwards it's all designed for the SAX Parsing with different event calling methods
public void startDocument() {
System.err.println("Start Document");
public void endDocument() {
System.err.println("End Document");
public void startElement(String uri, String name, String qName, Attributes atts) {
CurrentElement= name;
System.out.println("This is parsing");
public void characters(char ch[], int start, int length) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
StringBuffer sb = new StringBuffer();
for (int i = start; i < start + length; i++)
sb.append(ch);
String content = sb.toString();
if (CurrentElement.equals("eid"))
temp.setEventID( (Integer.valueOf(content)).intValue() ) ;
else if (CurrentElement.equals("sd"))
temp.setShort_description(content);
else if (CurrentElement.equals("ld"))
temp.setLong_description(content);
else if ( (CurrentElement.equals("dt")))
temp.setDate_Time( formatter.parse(content, new ParsePosition(0)) );
else if (CurrentElement.equals("repeat"))
temp.setRepeat_pattern( (Integer.valueOf(content)).intValue() );
else if (CurrentElement.equals("valid"))
temp.setValid_period(content);
else if (CurrentElement.equals("status")) {
temp.setStatus( (Integer.valueOf(content)).intValue() );
else {}
public void endElement(String uri, String name, String qName) {
System.err.println("DEBUG" + temp.toString()); /*debug*/
if (name.equals("event")) {
try {
/*debug*/ temp.setUserID(1);
/*debug*/ System.err.println("DEBUG: " + temp.toString());
sendSQL(temp, db_connection);
//temp = new Event();
catch (SQLException e) {
System.err.println(e);
}//end catch
}//end try
Where event is a public class Event {
//fields
private int userID = 1; // = 1 only applies for testing
private int eventID;
private String short_description;
private String long_description;
private Date date_time = null;
private int repeat_pattern;
private String valid_period;
private int status; //1 for new, 0 for modification and -1 for delete
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//Constructors
//every event requires the following: userID eventID and short_Description
public Event(int uID, int eID, String shortDescrp) {
setUserID(uID);
setEventID(eID);
setShort_description(shortDescrp);
public Event(int uid, int eid, String sd,
String ld, Date d_t, int r_p, String v_p, int s) {
setUserID(uid);
setEventID(eid);
setShort_description(sd);
setLong_description(ld);
setDate_Time(d_t);
setRepeat_pattern(r_p);
setValid_period(v_p);
setStatus(s);
//set
public void setUserID (int x) { this.userID = x ;}
public void setEventID (int x) { this.eventID = x ;}
public void setShort_description (String x) { this.short_description = x ;}
public void setLong_description (String x) { this.long_description = x ;}
public void setDate_Time(Date x) { this.date_time = x ;}
public void setRepeat_pattern (int x) { this.repeat_pattern = x ;}
public void setValid_period (String x) { this.valid_period = x ;}
public void setStatus (int x) { this.status = x; }
//get
public int getUserID() { return this.userID;}
public int getEventID() { return this.eventID;}
public String getShort_description() { return this.short_description;}
public String getLong_description() { return this.long_description;}
public Date getDate_Time() { return this.date_time;}
public int getRepeat_pattern() { return this.repeat_pattern;}
public String getValid_period() { return this.valid_period;}
public int getStatus() { return this.status; }
//Event to SQL statements;
public String toSQL() {
StringBuffer sb = new StringBuffer();
///if ( status == 1) {
sb.append( "INSERT INTO events SET" );
sb.append( " userID = " + userID + ", ");
sb.append( "eventID = " + eventID + ", " );
sb.append( "short_description = " + "\'" + short_description + "\'" + ", "); //String
sb.append( "long_description = " + "\'" + long_description + "\'" + ", "); //String
sb.append( "date_time = " + "\'" + formatter.format(date_time) + "\'" + ", ");
sb.append( "repeat_pattern = " + repeat_pattern + ", " );
sb.append( "valid_period = " + "\'" + valid_period + "\'" ); //String
sb.append( ";");
//} else if ( status == 2) {
System.err.println(sb.toString());
return sb.toString();
} My question is: I have taken my SQL query generated by toSQL() method in events and it worked.
Here is the funny thing:
Everything is correct syntax wise: No complaints what soever
The mysql part works: Tested separately.
So I tend to think that the problem lies within the SAX parser. I have written SAX2 parsers on this machine before and they have worked too. I tried inserting println statements all over startElement endElement etc etc only to find out that the SAX parser did not call any of the methods that I overided!! Why is that so?
Can you guys spot where my SAX parser fails?I see.
I try to correct this problem by removing super();
so right now my code looks like this:
static Event temp = new Event(0, 0, "null", "null", new Date(), 0, "null", 0);
static String CurrentElement = null;
static File XMLpath;
static Connection db_connection;
static XMLReader xr;
static DefaultHandler XMLSAXhandler;
//Constructor, Build the SAX Parser
public EventXMLParser(File path, Connection connection) {
try {
this.XMLpath = path;
this.db_connection = connection;
this.xr = XMLReaderFactory.createXMLReader();
this.XMLSAXhandler = new DefaultHandler(); //create a new own handler
this.xr.setContentHandler(XMLSAXhandler);
this.xr.setErrorHandler(XMLSAXhandler);
//System.out.println("DEBUG: db_connection is " + db_connection.toString());
catch (Exception e) {
System.out.println("Constructor Error!");
e.printStackTrace();
}This time, I created a new instance of default handler() which can be referenced by as the objects's XMLSAXhandler. However, that did not solve the problem, why does the problem still persist?
Right now, there is only one instance of a default handler created. So why does all my parsing event functions still get ignored? -
hi,
i am assuming the problem is with sax parser but i cant be sure. I am parsing a xml file (about 1.4MB) with some data in it. the parser i have created reads the xml file correctly for the most part but when at some point the
"public void characters(char buf[], int offset, int len) throws SAXException"
function stops working correctly....i.e it doesnt fully read read the data between the "<start>" and "</start>" element. say it reads about 100 id's correctly---for 101 ID it does this. This is just an example. Since, the problem might be with how :
"public void characters(char buf[], int offset, int len) throws SAXException"
function is reading the data i was wondering if anybody else had encountered this problem or please let me know if i need to change something in the code: here's a part of the code :
Bascially i have created three classes to enter data into three mysql tables and as i parse the data i fill up the columns by matching the column header with the tagName.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.*;
import java.io.*;
import java.util.ArrayList;
import java.lang.Object;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import java.util.*;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
public class Echo03 extends DefaultHandler
StringBuffer textBuffer;
int issuedValue, prodValue;
OrdHeader header = new OrdHeader();
OrdDetail detail = new OrdDetail();
Member memInfo = new Member();
//new addition to store the dynamic value of the products
TestOrdheader prod = new TestOrdheader();
int counter;
String tag, newTag;
SetValue setVal = new SetValue();
String test;
public static void main(String argv[])
if (argv.length != 1) {
System.err.println("Usage: cmd filename");
System.exit(1);
// Use an instance of ourselves as the SAX event handler
DefaultHandler handler = new Echo03();
// Use the default (non-validating) parser
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
// Set up output stream
out = new OutputStreamWriter(System.out, "UTF8");
// Parse the input
SAXParser saxParser = factory.newSAXParser();
saxParser.parse( new File(argv[0]), handler);
} catch (Throwable t) {
t.printStackTrace();
System.exit(0);
static private Writer out;
private String indentString = " "; // Amount to indent
private int indentLevel = 0;
//===========================================================
// SAX DocumentHandler methods
//===========================================================
public void startDocument()
throws SAXException
nl();
nl();
emit("START DOCUMENT");
nl();
emit("<?xml version='1.0' encoding='UTF-8'?>");
header.assign();
public void endDocument()
throws SAXException
nl(); emit("END DOCUMENT");
try {
nl();
out.flush();
} catch (IOException e) {
throw new SAXException("I/O error", e);
public void startElement(String namespaceURI,
String lName, // local name
String qName, // qualified name
Attributes attrs)
throws SAXException
indentLevel++;
nl(); //emit("ELEMENT: ");
String eName = lName; // element name
if ("".equals(eName)) eName = qName; // namespaceAware = false
if (qName.equals("Billing")){
issuedValue = 1;
}else if (qName.equals("Shipping")){
issuedValue = 2;
}else if (qName.equals("ShippingTotal")){
issuedValue = 3;
//check to see if "Product" is the name of the element thats coming next
if (qName.equals("Product")){
if (issuedValue != 3){
prodValue = 1;
prod.addCounter();
}else{
prodValue = 0;
tag = eName;
if (attrs != null) {
for (int i = 0; i < attrs.getLength(); i++) {
String aName = attrs.getLocalName(i); // Attr name
if ("".equals(aName)) aName = attrs.getQName(i);
nl();
emit(" ATTR: ");
emit(aName);
emit("\t\"");
emit(attrs.getValue(i));
emit("\"");
if (attrs.getLength() > 0) nl();
public void endElement(String namespaceURI,
String sName, // simple name
String qName // qualified name
throws SAXException
nl();
String eName = sName; // element name
if ("".equals(eName)){
eName = qName; // not namespaceAware
if ("Order".equals(eName)){
//enter into database
databaseEnter();
textBuffer = null;
indentLevel--;
public void characters(char buf[], int offset, int len)
throws SAXException
nl();
try {
String s = new String(buf, offset, len);
if (!s.trim().equals("")){
settag(tag, s);
s = null;
}catch (NullPointerException E){
System.out.println("Null pointer Exception:"+E);
//===========================================================
// Utility Methods ...
//===========================================================
// Wrap I/O exceptions in SAX exceptions, to
// suit handler signature requirements
private void emit(String s)
throws SAXException
try {
out.write(s);
out.flush();
} catch (IOException e) {
throw new SAXException("I/O error", e);
// Start a new line
// and indent the next line appropriately
private void nl()
throws SAXException
String lineEnd = System.getProperty("line.separator");
try {
out.write(lineEnd);
for (int i=0; i < indentLevel; i++) out.write(indentString);
} catch (IOException e) {
throw new SAXException("I/O error", e);
===================================================================
///User defined methods
===================================================================
private String strsplit(String splitstr){
String delimiter = new String("=");
String[] value = splitstr.split(delimiter);
value[1] = value[1].replace(':', ' ');
return value[1];
public void settag(String tag, String s){
String pp_transid = null, pp_respmsg = null,pp_authid = null, pp_avs = null, pp_avszip = null;
if ((tag.equals("OrderDate")) || (tag.equals("OrderProcessingInfo"))){
if (tag.equals("OrderDate")){
StringTokenizer st = new StringTokenizer(s);
String orddate = st.nextToken();
String ordtime = st.nextToken();
header.put("ordDate", orddate);
header.put("ordTime", ordtime);
}else if (tag.equals("OrderProcessingInfo")){
StringTokenizer st1 = new StringTokenizer(s);
int tokenCount = 1;
while (tokenCount <= st1.countTokens()){
switch(tokenCount){
case 1:
String extra = st1.nextToken();
break;
case 2:
String Opp_transid = st1.nextToken();
pp_transid = strsplit(Opp_transid);
break;
case 3:
String Opp_respmsg = st1.nextToken();
pp_respmsg = strsplit(Opp_respmsg);
break;
case 4:
String Opp_authid = st1.nextToken();
pp_authid = strsplit(Opp_authid);
break;
case 5:
String Opp_avs = st1.nextToken();
pp_avs = strsplit(Opp_avs);
break;
case 6:
String Opp_avszip = st1.nextToken();
pp_avszip = strsplit(Opp_avszip);
break;
tokenCount++;
header.put("pp_transid", pp_transid);
header.put("pp_respmsg", pp_respmsg);
header.put("pp_authid", pp_authid);
header.put("pp_avs", pp_avs);
header.put("pp_avszip", pp_avszip);
}else{
newTag = new String(setVal.set_name(tag, issuedValue));
header.put(newTag, s);
//detail.put(newTag, s);
prod.put(newTag, s);
memInfo.put(newTag,s);
//Check to see-- if we should add this product to the database or not
boolean check = prod.checkValid(newTag, prodValue);
if (check){
prod.addValues(s);
setVal.clearMod();
==================================================================
Here's the error that i get:
java.util.NoSuchElementException
at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:691)
at org.apache.crimson.parser.Parser2.parse(Parser2.java:337)
at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:448)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:345)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:281)
at Echo03.main(Echo03.java:47)I haven't gone through your code but I also had a similar error....and the exception in my was because of an "&" instead of the entity reference & in one of the element values. I use a non-validating parser but if you use a validating one then this might not be the reason for your exception.
-
SAX parser splits up character data; I expected Ign. whitesp
Im am working on a XML parser for loading data from some back
end systems into an Oracle 8i database. I am using the SAX
parser for this purpose. After doing some tests with larger
amounts of XML data (> 1M), I found some unexpected behaviour.
The parser sometimes splits up character data into two chunks of
data. The XML looks as follows:
<TAGNAME> this is the character data </TAGNAME>
The parser raises the following events:
1 startElement name = "TAGNAME"
2 characters chbuf = " "
3 characters chbuf = "this is the character data "
4 endElement name = "TAGNAME"
I expected an ignorableWhitespace event at step 2. The XML
document contains repetitive tagnames. The strange thing about
the parse process is that the parser splits up the character
data only sometimes, and I can't determine any kind of logica
for this behaviour. Most occurrences of exactly the same tagname
and character data are parsed correctly (that is, as I
expected).
Am I dealing with correct behaviour here, or is it a bug??
Rolf.
nullOracle XML Team wrote:
: Rolf van Deursen (guest) wrote:
: : Im am working on a XML parser for loading data from some
back
: : end systems into an Oracle 8i database. I am using the SAX
: : parser for this purpose. After doing some tests with larger
: : amounts of XML data (> 1M), I found some unexpected
behaviour.
: : The parser sometimes splits up character data into two
chunks
: of
: : data. The XML looks as follows:
: : <TAGNAME> this is the character data </TAGNAME>
: : The parser raises the following events:
: : 1 startElement name = "TAGNAME"
: : 2 characters chbuf = " "
: : 3 characters chbuf = "this is the character data "
: : 4 endElement name = "TAGNAME"
: : I expected an ignorableWhitespace event at step 2. The XML
: : document contains repetitive tagnames. The strange thing
about
: : the parse process is that the parser splits up the character
: : data only sometimes, and I can't determine any kind of
logica
: : for this behaviour. Most occurrences of exactly the same
: tagname
: : and character data are parsed correctly (that is, as I
: : expected).
: : Am I dealing with correct behaviour here, or is it a bug??
: : Rolf.
: The behavior is expected and correct. Could you elaborate on
why
: you would expect the parser to treat the whitespace signalled
in
: step 2 as ignorable?
: Oracle XML Team
: http://technet.oracle.com
: Oracle Technology Network
Thank you for your quick response.
In my test XML, there are about 27500 tags containing character
data. All character data starts with a whitespace character.
After parsing the xml, the whitespace of only 5 (!) tags is
treated as a seperate character event (so two character events
are raised in succession). The remaining tags all raise only ONE
character event for the entire character data. I can't explain
the difference in treatment.
null -
I'm trying to read a XML file in an EJB using a SAX parser.
I tried the following statement to create the reader
XMLReader xr = XMLReaderFactory.createXMLReader("oracle.xml.parser.v2.SAXParser");
but I obtain the following exception:
java.lang.ClassNotFoundException: oracle.xml.parser.v2.SAXParser
at org.xml.sax.helpers.XMLReaderFactory.createXMLReader(XMLReaderFactory.java:118)
The same works correctly from a command line application outside OC4J.
Is there another SAX Parser I can use in OC4J?
Andrea MattioliI'm also seeing the a similar problem trying to get my EJB to parse SAX using the Xerces parser. If I do
XMLReader myReader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
and place xerces.jar into $(OC4J_INSTALL_ROOT)\j2ee\home\lib then at runtime I get
java.lang.ClassNotFoundException: org.apache.xerces.parsers.SAXParser
This is despite the fact that calling Class.forName() on the same class name works fine. Setting the system property org.xml.sax.driver and calling createXMLReader with no parameters results in the same error.
I can force use of the Xerces SAX parser by bypassing the factory and just calling
XMLReader myReader = new org.apache.xerces.parsers.SAXParser();
but that seems a tad hacky and I don't want to hardwire SAX parser implementation choice into my code.
Is this a known bug?
Also which parser is getting used by default in OC4J i.e. if I don't set org.xml.sax.driver and use the no parameters variant of createXMLReader()?
Thanks
Alan -
Hello
I need to convert xml files to csv format using SAX Parser. The following code & outputs are as below:
XML file:
<Library>
<Book>
<Title>Professional JINI</Title>
<Author>bs</Author>
<Publisher>Oreilly Publications</Publisher>
</Book>
<Book>
<Title>XML Programming</Title>
<Author>java</Author>
<Publisher>Mann Publications</Publisher>
</Book>
</Library>
public class BooksLibrary extends DefaultHandler
protected static final String XML_FILE_NAME = "C:\\library1.xml";
public static void main (String argv [])
// Use the default (non-validating) parser
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
FileOutputStream fos=new FileOutputStream("C:/test.txt");
// Set up output stream
out = new OutputStreamWriter (fos, "UTF8");
// Parse the input
SAXParser saxParser = factory.newSAXParser();
saxParser.parse( new File(XML_FILE_NAME), new BooksLibrary() );
} catch (Throwable t) {
t.printStackTrace ();
System.exit (0);
static private Writer out;
//===========================================================
// Methods in SAX DocumentHandler
//===========================================================
public void startDocument ()
throws SAXException
showData ("<?xml version='1.0' encoding='UTF-8'?>");
newLine();
public void endDocument ()
throws SAXException
try {
newLine();
out.flush ();
} catch (IOException e) {
throw new SAXException ("I/O error", e);
public void startElement (String name, Attributes attrs)
throws SAXException
showData ("<"+name);
if (attrs != null) {
for (int i = 0; i < attrs.getLength (); i++) {
showData (" ");
showData (attrs.getLocalName(i)+"=\""+attrs.getValue (i)+"\"");
showData (">");
public void endElement (String name)
throws SAXException
showData ("</"+name+">");
public void characters (char buf [], int offset, int len)
throws SAXException
String s = new String(buf, offset, len);
showData (s);
//===========================================================
// Helpers Methods
//===========================================================
// Wrap I/O exceptions in SAX exceptions, to
// suit handler signature requirements
private void showData (String s)
throws SAXException
try {
out.write (s);
out.flush ();
} catch (IOException e) {
throw new SAXException ("I/O error", e);
// Start a new line
private void newLine ()
throws SAXException
//String lineEnd = System.getProperty("line.separator");
try {
out.write (", ");
} catch (IOException e) {
throw new SAXException ("I/O error", e);
--------------------------------------------------------------------------------------------------output is as follows:
<?xml version='1.0' encoding='UTF-8'?>,
Professional JINI
bs
Oreilly Publications
XML Programming
java
Mann Publications
Can anyone please tell me how to remove that indentation space & get the output as :
<?xml version='1.0' encoding='UTF-8'?>, Professional JINI, bs, Oreilly Publications, XML Programming, java, Mann Publications
ThanksBy the way, there is a new feature in Java 5.0 (Tiger) called "Annotations."
Since your code extneds DefaultHandler, you could specify a line with
@Override
before the definition of each of your methods. If you had used these, the compiler would have given an error since your methods did not override the methods of DefaultHandler.
(If your code implemented ContentHandler, by contrast, using @Override is invalid because you need to implement all of the methods defined in the interface definition.)
The other comment is that the safest way to handle characters() data is to use a StringBuilder/Buffer (StringBuilder is only valid in 5.0, StringBuffer has been around since Release 1.0) that you define in the startElement method. Use the append method to gather data presented to you in the characters() method and use toString() to harvest the data in the endElement method.
Dave Patterson -
Hello..
I have the following problem. When I parse an xml document with blank spaces and numbers with decimals, its sometimes comes out as one string and sometimes as two, for example "First A" sometimes comes out as "First" and "A" and sometimes as "First A", which is how its stored in the xml file. Same with numbers like 19.20. Im enclosing a little of my code..
public void characters(char buf[], int offset, int len)
throws SAXException
if (textBuffer != null) {
SaveString = ""+textBuffer;
if(i>-1)
numbers = SaveString;
Whats wrong and how do I fix it.
Best Regards Dan
PS I have more code, in data and out data if needed.DsHello,
I do not know if this is your problem, yet please find hereafter an excerpt of the SAX API:
public void characters(char[] ch,
int start,
int length)
throws SAXException
... SAX parsers may return all contiguous character data in a single chunk, or they may split it into several chunks;...
... Note that some parsers will report whitespace in element content using the ignorableWhitespace method rather than this one (validating parsers must do so)...
In other words, I am afraid that your issue is the "standard behaviour" of a SAX parser.
I hope it helps. -
SAX Parser method charaters trouble
Hi,
I am using a sax parser for loading an xml file of size over 1gb. The problem whats happening is that the content gets truncated at random.
And this truncation happens in the characters method of the sax parser. This am sure as I logged the content I get from characters method before starting my processing. for ex:
<content>signal1,signal960</content>
<content>signal1,signal970</content>
On parsing the above snippet, the first content "signal1,signal960"
gets extracted completely, however the next one is truncated, and the truncation is random. This happens for some tags, and then the extraction resumes normally. And this truncation starts occuring again after it has extracted a few tags.
Also the first truncation started occuring only after parsing around 200 mb of the 1gb file.
Could anyone tell if there is some limitation with XERCES or CRIMSON.
or if any other one that I can use???
Regards,
R.To quote from the Documentation of ContentHandler.characters:
-- start quote --
The Parser will call this method to report each chunk of character data. SAX parsers may return all contiguous character data in a single chunk, or they may split it into several chunks; however, all of the characters in any single event must come from the same external entity so that the Locator provides useful information.
-- end quote --
So providing the content in two seperate calls is perfectly valid and must be handled by your code. It's probably a result of the internal workings of the XML parser and allowing that in the Parser specification probably allowed some optimizations that would otherwise be impossible (a constant buffer size, for example).
Maybe you are looking for
-
Loop at itab in a Smarform problem
Hi Guys, Right now i'm developing my first OO program that calls a Smartform, but I'm having the following issue. I call a method exporting the internal table that i want to pass to the SF, but when i want to make a loop statement in the SF I get a d
-
I have the "tap to tweet" option in my notifications center, I don't however have "tap to post" for Facebook. My share widget is on, my Facebook is "on" in my notification center. I have uninstalled and re-installed Facebook, restarted my phone, ever
-
Dear Sir's, Our user wants to see the Rejection reason in stock report i.e MB52,MB51. Is it any t-code where we can seen the Block stock with rejection reason. The rejection reason feed at the time of "Usage Decision". Please suggest me. Thanks in ad
-
Slow Web Page Loading in Safari & Firefox
A few months ago, Safari began loading web pages extremely slowly, regardless of the Internet connection. I don't recall doing anything special at the time; it just kind of started all of a sudden. I thought it might a problem with Safari, so I downl
-
Consuming web service from service registry
Hi We are trying to use web services created from ECC function modules in to VC model. These services are tested fine from wsnavigater. But throw following errors while trying to run and build them from VC. 1. For BAPI_REQGETdetails service when we d