SAX Parser is dropping characters
Hello,
We have noticed that the BEA implementation of the SAX parser appears
to drop characters from the start of an attribute's value.
For example:
<attribute-value>au.com.bonline.bean.SomeClass</attribute-value>
becomes
online.bean.SomeClass
after parsing.
Has anyone seen this behaviour before ?
Previously we were running the application under tomcat and did not have
this issue with the implementation of the SAX parser that comes with
tomcat.
Are there changes we have to make to the way we code against the
SAX parser that we might have missed moving from tomcat to BEA ?
Thankyou,
Brian Gorrie
Programmer/Analyst
B Digital
Hi Brian,
I just tried this simple program with the output below; it worked OK
using WLS 8.1
What WLS version and can you provide a test case?
Thanks,
Bruce
C:\stephens\CRs\crXML>type attr.xml
<?foo version="1.0" ?>
<A>
<attribute-value>au.com.bonline.bean.SomeClass</attribute-value>
</A>
C:\stephens\CRs\crXML>java -classpath .;%CLASSPATH% sax attr.xml
Start document
Processing Instruction:
target: foo
data: version="1.0"
Start element: A
Characters: "\n"
Start element: attribute-value
Characters: "au.com.bonline.bean.SomeClass"
End element: attribute-value
Characters: " \n"
End element: A
End document
Brian Gorrie wrote:
>
Hello,
We have noticed that the BEA implementation of the SAX parser appears
to drop characters from the start of an attribute's value.
For example:
<attribute-value>au.com.bonline.bean.SomeClass</attribute-value>
becomes
online.bean.SomeClass
after parsing.
Has anyone seen this behaviour before ?
Previously we were running the application under tomcat and did not have
this issue with the implementation of the SAX parser that comes with
tomcat.
Are there changes we have to make to the way we code against the
SAX parser that we might have missed moving from tomcat to BEA ?
Thankyou,
Brian Gorrie
Programmer/Analyst
B Digital[sax.java]
Similar Messages
-
Xerces SAX parser don`t initialize a characters array
Xerces SAX parser don`t initialize a characters array from characters() method in DefaultHandler.
I use jdk 1.5.12.
For value "22-11-2009" variables start=1991, length=9.
Result: "22-11-200"My handler:
package com.epam.xmltask.parsers;
import com.epam.xmltask.model.Category;
import com.epam.xmltask.model.Goods;
import com.epam.xmltask.model.Products;
import com.epam.xmltask.model.Subcategory;
import com.epam.xmltask.utils.Constants;
import com.epam.xmltask.utils.DateConverter;
import java.text.ParseException;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXProductsParser extends DefaultHandler implements IProductsParser {
private Logger logger = null;
private SAXParser parser = null;
private ErrorHandler errorHandler = null;
private Products products = null;
private Category category = null;
private Subcategory subcategory = null;
private Goods goods = null;
private String currentField = Constants.EMPTY_STRING;
protected Logger getLogger() {
if (logger == null) {
logger = Logger.getLogger(SAXProductsParser.class.getName());
return logger;
protected SAXParser getParser() throws Exception {
if (parser == null) {
try {
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
parserFactory.setNamespaceAware(true);
parserFactory.setValidating(true);
parser = parserFactory.newSAXParser();
parser.setProperty(Constants.SCHEMA_LANGUAGE, Constants.XML_SCHEMA);
} catch (Exception ex) {
getLogger().log(Level.SEVERE, null, ex);
throw ex;
return parser;
public ErrorHandler getErrorHandler() {
if (errorHandler == null) {
errorHandler = new ProductsErrorHandler();
return errorHandler;
public Products getProducts(String uri) throws Exception {
try {
products = new Products();
getParser().parse(uri, this);
return products;
} catch (Exception ex) {
getLogger().log(Level.SEVERE, null, ex);
throw ex;
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) {
if (Constants.CATEGORY.equals(qName)) {
String name = attributes.getValue(Constants.NAME);
category = new Category(name);
} else if (Constants.SUBCATEGORY.equals(qName)) {
String name = attributes.getValue(Constants.NAME);
subcategory = new Subcategory(name);
} else if (Constants.GOODS.equals(qName)) {
String name = attributes.getValue(Constants.NAME);
goods = new Goods(name);
} else if (Constants.NOT_IN_STOCK.equals(qName)) {
goods.setIsInStock(false);
} else {
currentField = qName;
@Override
public void endElement(String uri, String localName, String qName) {
if (Constants.CATEGORY.equals(qName)) {
products.addCategory(category);
category = null;
} else if (Constants.SUBCATEGORY.equals(qName)) {
category.addSubcategory(subcategory);
subcategory = null;
} else if (Constants.GOODS.equals(qName)) {
subcategory.addGoods(goods);
goods = null;
} else {
currentField = Constants.EMPTY_STRING;
@Override
public void characters(char[] chars, int start, int length) throws SAXException {
String field = new String(chars, start, length).trim();
if (goods != null) {
if (Constants.PRODUSER.equals(currentField)) {
goods.setProducer(field);
} else if (Constants.MODEL.equals(currentField)) {
goods.setModel(field);
} else if (Constants.DATE_OF_ISSUE.equals(currentField)) {
Date date = null;
try {
date = DateConverter.getConvertedDate(field);
} catch (ParseException ex) {
getLogger().log(Level.SEVERE, null, ex);
throw new SAXException(ex);
goods.setDateOfIssue(date);
} else if (Constants.COLOR.equals(currentField)) {
goods.setColor(field);
} else if (Constants.PRICE.equals(currentField)) {
Float price = Float.valueOf(field);
goods.setPrice(price);
@Override
public void error(SAXParseException ex) throws SAXException {
getErrorHandler().error(ex);
@Override
public void fatalError(SAXParseException ex) throws SAXException {
getErrorHandler().fatalError(ex);
@Override
public void warning(SAXParseException ex) throws SAXException {
getErrorHandler().warning(ex);
} -
Characters method in SAX parser
Hi
I have a SAX Parser Appln where in I am trying to run it in English Locale But the xml file contains Arabic Characters.
The method characters looks like this
public void characters(char buf[], int offset, int len) throws SAXException
if (recognisedTopElementStarted && storyStarted && recognisedElementStarted )
buffer.append ( new String(buf,offset,len) ) ;
//buffer.append ( new String(buf,offset,len,"UTF-16") ) ;
In this method I want to convert the char array to byte array so as to specify the encoding for constructing a String object(Arabic characters) with correct encoding as specified in the commented statement.
How to do it so as to get the arabic characters
Thanks
RajHi Raj,
I don't have Arabic support on my machine, so I tried with Greek, which has a significant Unicode code page.
To get a byte array, I did this:
byte[] ba = new String(buf, offset, len).getBytes("utf-16");To double check, I saved the byte array in a file output stream and validated the encoding in XML Spy.
So it works for Greek, let's hope it will work for our friends across the Mediterranean sea ;-)
Regards,
David -
Getting characters in a particular xml tag type during Sax parsing.
How do I get the text within a certain XML tag using the parser. I can use the parser which will get me all the text in all the tags, but how do I get the ones I need only.
For example:
<channel id="south-east.bbc1.bbc.co.uk">
<display-name lang="en">BBC1</display-name>
<display-name>1</display-name>
</channel>
<programme start="20040217233500" stop="20040218000500 +0000" channel="south-east.bbc1.bbc.co.uk">
<title lang="en">Film 2004 with Jonathan Ross</title>
</programme>how do I get the text 'Film 2004 with Jonathan Ross' without getting the others?Well, the SAX parser just gives you the start/end tag
information to a handler, right? So if you just use
the SAX parser to get one item, then you could do it
by running thru the entire XML file to get that item
then get another item. Clearly this isn't the best
way to do it.... The handler should put the data for
the whole document into some data structure, or use
DocumentBuilder to get a Document object. I see. Yes, that is not the way to use SAX. It's kind of an inside out way of doing things. If you using SAX you should know everything that you want before parsing and grab all of them in one fell swoop.
If you want to get an in memory representation, the JDOM package is a whole lot eaiser to use than DOM. -
Is there a SAX parser with PL/SQL??
Hi All,
I am a Oracle developer and generally want to do everything from PL/SQL.
So, from a PL/SQL procedure I would like to parse a XML document. I have tried hard to find a PL/SQL package which can give me a PL/SQL SAX parser, but could not find one.
All packages are based on DOM tree.
Please convey if I am wrong and is there a SAX parser?
I know that there is only one package DBMS_XMLSTORE which is C based and uses SAX parser, but it does not have procedures/functions like ".parse()".
Thanks and regardsHere's an example
SQL> --
SQL> define MODULE=SaxProcessor
SQL> define CLASS=com/oracle/st/xmldb/pm/examples/SaxProcessor
SQL> --
SQL> set define off
SQL> --
SQL> var sourceFileName varchar2(32)
SQL> var targetPath varchar2(1024)
SQL> --
SQL> begin
2 :sourceFileName := 'JavaSource';
3 :targetPath := '/public/' || :sourceFileName || '.java';
4 end;
5 /
PL/SQL procedure successfully completed.
SQL> declare
2 res boolean;
3 javaSource clob :=
4 'package com.oracle.st.xmldb.pm.examples;
5
6
7 import java.io.IOException;
8 import java.io.StringWriter;
9
10 import java.io.Writer;
11
12 import java.sql.DriverManager;
13 import java.sql.SQLException;
14
15 import java.util.Enumeration;
16 import java.util.Hashtable;
17
18 import oracle.jdbc.OracleConnection;
19 import oracle.jdbc.OracleDriver;
20
21 import oracle.jdbc.OraclePreparedStatement;
22
23 import oracle.sql.BFILE;
24
25 import oracle.sql.CLOB;
26
27 import oracle.xml.parser.v2.SAXParser;
28 import oracle.xml.parser.v2.XMLDocument;
29 import oracle.xml.parser.v2.XMLElement;
30
31
32 import org.w3c.dom.Attr;
33 import org.w3c.dom.Element;
34 import org.w3c.dom.Node;
35
36 import org.xml.sax.Attributes;
37 import org.xml.sax.ContentHandler;
38 import org.xml.sax.Locator;
39 import org.xml.sax.SAXException;
40
41 public class SaxProcessor implements ContentHandler {
42
43 public static final boolean DEBUG = true;
44
45 private OracleConnection dbConnection;
46
47 private OraclePreparedStatement insertStatement;
48 private OraclePreparedStatement errorStatement;
49 private CLOB clob;
50
51 private Hashtable namespaceToPrefix = null;
52 private Hashtable prefixToNamespace = null;
53 private String targetElementName = null;
54
55 private XMLDocument currentDocument;
56 private Node currentNode;
57
58 private int documentCount = 0;
59
60 public SaxProcessor() {
61 this.namespaceToPrefix = new Hashtable();
62 this.prefixToNamespace = new Hashtable();
63 }
64
65 private boolean isTargetElement(String elementName) {
66 return ((this.currentDocument == null) &&
67 (elementName.equals(this.targetElementName)));
68 }
69
70 public void startDocument() throws SAXException {
71 }
72
73 public void endDocument() throws SAXException {
74 }
75
76 public void startElement(String namespaceURI, String localName, String elementName, Attributes attrs)
77 throws SAXException
78 {
79 if (DEBUG) {
80 System.out.println("startElement() : URI = " + namespaceURI + ", localName = " + localName + ", elementName = " + elementNa
me);
81 }
82 if (this.currentDocument == null)
83 {
84 if (DEBUG) {
85 System.out.println("startElement() : Checking for start of Fragment.");
86 }
87 if (isTargetElement(localName))
88 {
89 if (DEBUG) {
90 System.out.println("startElement() : Starting New Document");
91 }
92 this.currentDocument = new XMLDocument();
93 this.currentNode = this.currentDocument;
94 XMLElement rootElement = createNewElement(namespaceURI, localName, elementName, attrs);
95 this.currentDocument.appendChild(rootElement);
96 this.currentNode = rootElement;
97 }
98 }
99 else
100 {
101 XMLElement nextElement = createNewElement(namespaceURI, localName, elementName, attrs);
102 this.currentNode.appendChild(nextElement);
103 this.currentNode = nextElement;
104 }
105 }
106
107 public void endElement(String namespaceURI, String localName, String qName)
108 throws SAXException
109 {
110 if (this.currentDocument != null)
111 {
112 if (this.currentNode.equals(this.currentDocument.getDocumentElement()))
113 {
114 try
115 {
116 insertDocument();
117 this.currentDocument = null;
118 }
119 catch (SQLException sqlE)
120 {
121 throw new SAXException(sqlE);
122 }
123 catch (IOException ioe)
124 {
125 throw new SAXException(ioe);
126 }
127 }
128 else
129 {
130 this.currentNode = this.currentNode.getParentNode();
131 }
132 }
133 }
134
135 private XMLElement createNewElement(String namespaceURI, String localName,
136 String elementName, Attributes attrs) {
137 XMLElement newElement = null;
138 if (namespaceURI != null) {
139 if (this.namespaceToPrefix.containsKey(namespaceURI)) {
140 /* Namespace in already in Scope - create Element from Qualified Name */
141 newElement =
142 (XMLElement)this.currentDocument.createElement(elementName);
143 } else {
144 /* Namespace is not already in Scope - create Element with namespace */
145 newElement =
146 (XMLElement) this.currentDocument.createElementNS(namespaceURI,
147 elementName);
148 newElement.setPrefix((String)this.namespaceToPrefix.get(namespaceURI));
149 }
150 } else {
151 newElement =
152 (XMLElement)this.currentDocument.createElement(localName);
153 }
154 addAttributes(newElement, attrs);
155 if (this.currentNode.equals(this.currentDocument)) {
156 addNamespaceDeclarations(newElement);
157 }
158 return newElement;
159 }
160
161 private void addAttributes(Element element, Attributes attrs) {
162 for (int i = 0; i < attrs.getLength(); i++) {
163 if (attrs.getURI(i).equals("http://www.w3.org/2000/xmlns/")) {
164 } else {
165 element.setAttribute(attrs.getQName(i), attrs.getValue(i));
166 }
167 }
168 }
169
170 private void addNamespaceDeclarations(Element element) {
171 Enumeration keys = this.namespaceToPrefix.keys();
172 while (keys.hasMoreElements()) {
173 String namespace = (String)keys.nextElement();
174 String prefix = (String)namespaceToPrefix.get(namespace);
175 Attr attr = null;
176 if (prefix.equals("")) {
177 attr = this.currentDocument.createAttribute("xmlns");
178 attr.setValue(namespace);
179 element.setAttributeNode(attr);
180 } else {
181 if (!prefix.equals(element.getPrefix())) {
182 attr =
183 this.currentDocument.createAttribute("xmlns:" + prefix);
184 attr.setValue(namespace);
185 element.setAttributeNode(attr);
186 }
187 }
188 }
189 }
190
191 public void characters(char[] p0, int p1, int p2) throws SAXException {
192 if (this.currentDocument != null) {
193 StringWriter sw = new StringWriter();
194 sw.write(p0, p1, p2);
195 String value = sw.toString();
196 Node textNode = this.currentDocument.createTextNode(value);
197 this.currentNode.appendChild(textNode);
198 }
199 }
200
201 public void startPrefixMapping(String prefix,
202 String uri) throws SAXException {
203 this.namespaceToPrefix.put(uri, prefix);
204 this.prefixToNamespace.put(prefix, uri);
205 }
206
207 public void endPrefixMapping(String prefix) throws SAXException {
208 Enumeration e = prefixToNamespace.keys();
209 while (e.hasMoreElements()) {
210 String thisPrefix = (String)e.nextElement();
211 if (thisPrefix.equals(prefix)) {
212 String namespace =
213 (String)prefixToNamespace.remove(thisPrefix);
214 namespaceToPrefix.remove(namespace);
215 }
216 }
217 }
218
219 public void ignorableWhitespace(char[] p0, int p1,
220 int p2) throws SAXException {
221 // throw new SAXException ("Un-Implemented Method: ingnoreableWhitespace");
222 }
223
224 public void processingInstruction(String p0,
225 String p1) throws SAXException {
226 throw new SAXException("Un-Implemented Method: processingInstruction");
227 }
228
229 public void setDocumentLocator(Locator p0) {
230 // throw new SAXException ("Un-Implemented Method: setDocumentLocator");
231 }
232
233 public void skippedEntity(String p0) throws SAXException {
234 throw new SAXException("Un-Implemented Method: skippedEntity");
235 }
236
237 public void doParse(BFILE bfile, String targetElement,
238 String targetTable, String errorTable) throws Exception {
239 this.targetElementName = targetElement;
240 String insertStatementText =
241 "insert into " + targetTable + " values (xmlParse(DOCUMENT ? WELLFORMED))";
242 String errorStatementText =
243 "insert into " + errorTable + " values (xmlParse(DOCUMENT ? WELLFORMED))";
244
245 DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
246 OracleDriver ora = new OracleDriver();
247 this.dbConnection = (OracleConnection)ora.defaultConnection();
248
249 this.insertStatement =
250 (OraclePreparedStatement)this.dbConnection.prepareStatement(insertStatementText);
251 this.errorStatement =
252 (OraclePreparedStatement)this.dbConnection.prepareStatement(errorStatementText);
253
254 this.clob =
255 CLOB.createTemporary(this.dbConnection, true, CLOB.DURATION_SESSION);
256
257 SAXParser parser = new SAXParser();
258 parser.setAttribute(SAXParser.STANDALONE, Boolean.valueOf(true));
259 parser.setValidationMode(SAXParser.NONVALIDATING);
260 parser.setContentHandler(this);
261 bfile.openFile();
262 parser.parse(bfile.getBinaryStream());
263 bfile.closeFile();
264 this.insertStatement.close();
265 this.errorStatement.close();
266 }
267
268 private void insertDocument() throws SQLException, IOException {
269 this.clob.truncate(0);
270 Writer out = clob.setCharacterStream(0);
271 this.currentDocument.print(out);
272 out.close();
273
274 this.insertStatement.setClob(1, clob);
275 this.insertStatement.execute();
276
277 this.documentCount++;
278
279 if (DEBUG) {
280 System.out.println("insertDocument() : Document Inserted");
281 }
282 }
283
284 public static int parseBFile(BFILE bfile, String targetElement,
285 String targetTable, String errorTable) throws Exception {
286 try {
287 SaxProcessor processor = new SaxProcessor();
288 processor.doParse(bfile,targetElement,targetTable,errorTable);
289 return processor.documentCount;
290 }
291 catch (Exception e) {
292 e.printStackTrace(System.out);
293 throw e;
294 }
295
296 }
297 }
298 ';
299 begin
300 if dbms_xdb.existsResource(:targetPath) then
301 dbms_xdb.deleteResource(:targetPath);
302 end if;
303 res := dbms_xdb.createResource(:targetPath,javaSource);
304 end;
305 /
Queuing DELETE Event
PL/SQL procedure successfully completed.
SQL> --
SQL> set define on
SQL> --
SQL> create or replace and resolve java source
2 named "&MODULE"
3 using blob
4 (
5 select xdburiType('/public/JavaSource.java').getBlob(nls_charset_id('WE8ISO8859P1'))
6 from dual
7 )
8 /
old 2: named "&MODULE"
new 2: named "SaxProcessor"
Java created.
SQL> show errors
No errors.
SQL> --
SQL> declare
2 shortname varchar2(128);
3 begin
4 shortname := dbms_java.shortname('&CLASS');
5 execute immediate 'grant execute on "' || shortname || '" to public';
6 end;
7 /
old 4: shortname := dbms_java.shortname('&CLASS');
new 4: shortname := dbms_java.shortname('com/oracle/st/xmldb/pm/examples/SaxProcessor');
PL/SQL procedure successfully completed.
SQL> create or replace package SAX_PROCESSOR
2 as
3 procedure PARSE_BFILE(file BFILE, targetElement varchar2, targetTable varchar2, errorTable varchar2);
4 end;
5 /
Package created.
SQL> show errors
No errors.
SQL> --
SQL> create or replace package body SAX_PROCESSOR
2 as
3 --
4 procedure PARSE_BFILE(file BFILE, targetElement varchar2, targetTable varchar2, errorTable varchar2)
5 AS LANGUAGE JAVA
6 NAME 'com.oracle.st.xmldb.pm.examples.SaxProcessor.parseBFile( oracle.sql.BFILE, java.lang.String, java.lang.String, java.lang.Strin
g)';
7 end;
8 /
Package body created.
SQL> show errors
No errors.
SQL> --
SQL> drop table PO_TEST
2 /
Table dropped.
SQL> create table PO_TEST of XMLTYPE
2 /
Table created.
SQL> drop table PO_ERROR
2 /
Table dropped.
SQL> create table PO_ERROR of XMLTYPE
2 /
Table created.
SQL> create or replace directory xmldir as 'c:\temp'
2 /
Directory created.
SQL> set serveroutput on
SQL> --
SQL> call SAX_PROCESSOR.PARSE_BFILE(bfilename('XMLDIR','testcase.xml'),'PurchaseOrder','PO_TEST','PO_ERROR')
2 /
call SAX_PROCESSOR.PARSE_BFILE(bfilename('XMLDIR','testcase.xml'),'PurchaseOrder','PO_TEST','PO_ERROR')
ERROR at line 1:
ORA-29549: class XFILES.com/oracle/st/xmldb/pm/examples/SaxProcessor has
changed, Java session state cleared
SQL> call SAX_PROCESSOR.PARSE_BFILE(bfilename('XMLDIR','testcase.xml'),'PurchaseOrder','PO_TEST','PO_ERROR')
2 /
Call completed.
SQL> select count(*) from PO_TEST
2 /
3
SQL> select * from PO_TEST
2 /
<PurchaseOrder xsi:noNamespaceSchemaLocation="http://xfiles:8080/home/SCOTT/poSo
urce/xsd/purchaseOrder.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
">
<Reference>AMCEWEN-20030409123336271PDT</Reference>
<Actions>
<Action>
<User>KPARTNER</User>
</Action>
</Actions>
<Reject/>
<Requestor>Allan D. McEwen</Requestor>
<User>AMCEWEN</User>
<PurchaseOrder xsi:noNamespaceSchemaLocation="http://xfiles:8080/home/SCOTT/poSo
urce/xsd/purchaseOrder.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
">
<Reference>SKING-20030409123336321PDT</Reference>
<Actions>
<Action>
<User>SKING</User>
</Action>
</Actions>
<Reject/>
<Requestor>Steven A. King</Requestor>
<User>SKING</User>
<PurchaseOrder xsi:noNamespaceSchemaLocation="http://xfiles:8080/home/SCOTT/poSo
urce/xsd/purchaseOrder.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
">
<Reference>SMCCAIN-20030409120030451PDT</Reference>
<Actions>
<Action>
<User>SVOLLMAN</User>
</Action>
</Actions>
<Reject/>
<Requestor>Samuel B. McCain</Requestor>
<User>SMCCAIN</User>
SQL> -
How to deal with empty tags in a SAX Parser
Hi,
I hope someone can help me with the problem I am having!
Basically, I have written an xml-editor application. When an XML file is selected, I parse the file with a SAX parser and save the start and end locations of all the tags and character data. This enables me to display the xml file with the tags all nicely formatted with pretty colours. Truly it is a Joy To Behold. However, I have a problem with tags in this form:
<package name="boo"/>
because the SAX parser treats them like this:
<package name = boo>
</package>
for various complex reasons the latter is unaccetable so my question is: Is there some fiendishly clever method to detect tags of this type as they occur, so that I can treat them accordingly?
Thanks,
ChrisI have spent some time on googling for code doing this, but found nothing better, than I had to write in by myself.
So, it would be something like this. Enjoy :)
package comd;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import org.xml.sax.Attributes;
import java.util.Stack;
import java.util.Enumeration;
public class EmptyTagsHandler extends DefaultHandler {
private StringBuilder xmlBuilder;
private Stack<XmlElement> elementStack;
private String processedXml;
private class XmlElement{
private String name;
private boolean isEmpty = true;
public XmlElement(String name) {
this.name = name;
public void setNotEmpty(){
isEmpty = false;
public EmptyTagsHandler(){
xmlBuilder = new StringBuilder();
elementStack = new Stack();
private String getElementXPath(){
StringBuilder builder = new StringBuilder();
for (Enumeration en=elementStack.elements();en.hasMoreElements();){
builder.append(en.nextElement());
builder.append("/");
return builder.toString();
public String getXml(){
return processedXml;
public void startDocument() throws SAXException {
xmlBuilder = new StringBuilder();
elementStack.clear();
processedXml = null;
public void endDocument() throws SAXException {
processedXml = xmlBuilder.toString();
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (!elementStack.empty()) {
XmlElement elem = elementStack.peek();
elem.setNotEmpty();
xmlBuilder.append("<");
xmlBuilder.append(qName);
for (int i=0; i<attributes.getLength();i++){
xmlBuilder.append(" ");
xmlBuilder.append(attributes.getQName(i));
xmlBuilder.append("=");
xmlBuilder.append(attributes.getValue(i));
xmlBuilder.append(">");
elementStack.push(new XmlElement(qName));
public void endElement(String uri, String localName, String qName) throws SAXException {
XmlElement elem = elementStack.peek();
if (elem.isEmpty) {
xmlBuilder.insert(xmlBuilder.length()-1, "/");
} else {
xmlBuilder.append("</");
xmlBuilder.append(qName);
xmlBuilder.append(">");
elementStack.pop();
public void characters(char ch[], int start, int length) throws SAXException {
if (!elementStack.empty()) {
XmlElement elem = elementStack.peek();
elem.setNotEmpty();
String str = new String(ch, start, length);
xmlBuilder.append(str);
public void ignorableWhitespace(char ch[], int start, int length) throws SAXException {
String str = new String(ch, start, length);
xmlBuilder.append(str);
} -
XML SAX parser that support LexicalHandler
Hello,
I'm looking for an XML SAX parser that support a LexicalHandler.
I have xml files that are not well formed, ie: (&, <, >, etc...) characters within tags and I need to ignore them.
Anyone have a link to some opensource library ??
Thanks,
SamirDon't waste your time. Using a LexicalHandler isn't going to help with parsing malformed XML. You should get the person who produced those files to replace them with correct XML.
PC² -
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.
-
I am using the sax parser provided by the package javax.xml.parsers to parse an XML file. It works fine as long as I have an XML file which has English characters. When I use it for parsing a file which has Korean characters in it, the parser fails to recognize them.
It used to throw an error "Line too long" on reading the Korean characters. Then I added an XML directive encoding="EUC-KR" and now it reads the file but does not recognize the characters correctly. It reads all the korean characters as question marks ('??').
Any pointers on what can be done to fix this problem.
Thanks,
RahulJHi,
We've got a very similar problem. I'm parsing with SAX and DOM but the MS special characters keep appearing as ? or ??.
If the encoding is not specified in the XML file there are Parser Exceptions. If I set the encoding to "JISAutoDetect", "JIS", "MS932", "Cp1250 to Cp1258" or "ISO8859-1" then there are no exceptions but the stray characters still appear as ?s.
I managed to display the left and the right quotation marks in a servlet by setting the response Content Type to "text/html; charset=Shift_JIS" and the encoding="Cp1252" in the XML file. But I still have problems with the rest of the characters.
What kind of output do you use? Do you display in a web page or you just write to a file?
Thanks,
Ross -
As I reported in this thread: Carriage Returns in XSLT output I am trying to produce a text output file with each line terminating in cr-lf (using the output from ViewObject.writeXML() passed through the XSLProcessor.processXSL() method to apply a XSLT stylesheet transformation to it), but the cr characters in the stylesheet are being converted to nl characters, so I am ending up with two nl characters at the end of each line.
I found a 2002 query (here: http://www.xslt.com/html/xsl-list/2002-04/msg00193.html) by someone with the same problem, and a reply by Steve Muench explaining it and stating that the Oracle SAX parser does not have the same problem.
So my question now is - does the SAX parser still retain cr characters (or is it too now converting them to nl) and if it does, how do I make XSLProcessor.processXSL() use it rather than the default XML parser? Can I do it from within my code, or does it need to be set in some sort of environment variable? We are on version 9.0.5.2 of JDeveloper(10g)Repost
-
How to get a specific tag value from SAX parser
I am using the SAX method to parse my xml file.
My Question is how to get the returning characters parsed after calling?
esp the value of <body> tag?
Here is my xml file, and i want to get the parsed <body> value after call sax parser.
<?xml version="1.0" encoding="UTF-8"?>
<article>
<content>
<title>floraaaaa</title>
<date>2004-03-19</date>
<body>
Details of an article, and i want to get the article details
</body>
</content>
</article>here is the parser code I am using:
import java.io.*;
import org.apache.xerces.parsers.SAXParser;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.ErrorHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class test2 {
public String m_xmlDetail;
public void readDetail(String url) {
System.out.println("Parsing XML File: " + url + "\n\n");
try {
XMLReader parser = new SAXParser();
ContentHandler contentHandler = new MyContentHandler();
parser.setContentHandler(contentHandler);
parser.parse(url);
} //try ends here
catch (IOException e) {
System.out.println("Error reading URI: " + e.getMessage());
} //catch ends here
catch (SAXException e) {
System.out.println("Error in parsing: " + e.getMessage());
} //catch ends here
} //function
}//close class
public class MyContentHandler implements ContentHandler {
private Locator locator;
//public String m_bodyDetail=new String();
public void setDocumentLocator(Locator locator) {
System.out.println(" * setDocumentLocator() called");
this.locator = locator;
public void startDocument() throws SAXException {
System.out.println("Parsing begins...");
public void endDocument() throws SAXException {
System.out.println("...Parsing ends.");
public void processingInstruction(String target, String data)throws SAXException {
System.out.println("PI: Target:" + target + " and Data:" + data);
public void startPrefixMapping(String prefix, String uri) {
System.out.println("Mapping starts for prefix " + prefix + " mapped to URI " + uri);
public void endPrefixMapping(String prefix) {
System.out.println("Mapping ends for prefix " + prefix);
public void startElement(String namespaceURI, String localName,String rawName, Attributes atts)throws SAXException {
System.out.print("startElement: " + localName);
if (!namespaceURI.equals("")) {
System.out.println(" in namespace " + namespaceURI + " (" + rawName + ")");
else {
System.out.println(" has no associated namespace");
for (int i=0; i<atts.getLength(); i++)
System.out.println(" Attribute: " + atts.getLocalName(i) +"=" + atts.getValue(i));
public void endElement(String namespaceURI, String localName, String rawName) throws SAXException {
System.out.println("endElement: " + localName + "\n");
public void characters(char[] ch, int start, int end) throws SAXException {
String s = new String(ch, start, end);
System.out.println("characters: " + s);
public void ignorableWhitespace(char[] ch, int start, int end)throws SAXException {
String s = new String(ch, start, end);
System.out.println("ignorableWhitespace: [" + s + "]");
public void skippedEntity(String name) throws SAXException {
System.out.println("Skipping entity " + name);
} //close class -
Problem in using SAX parser.
Hai All,
I have got a problem in using SAX parser.
My XML looks like this:
<authorizer>
<first-name>HP</first-name>
<last-name>Services</last-name>
<phone>800-22-1984</phone>
</authorizer>
<destination>
<first-name>John</first-name>
<last-name>Doe</last-name>
<company>John Doe Enterprises, Inc.</company>
<department>Manufacturing</department>
<phone>800-555-1234</phone>
<address>
<street-one>1654 Peachtree Str</street-one>
<street-two>Suite Y</street-two>
<city>Atlanta</city>
<province>GA</province>
<country>US</country>
<postal-code>30326</postal-code>
</address>
</destination>
my part of SAX parser code is:
public void startElement (String name, AttributeList attrs)
throws SAXException
accumulator.setLength(0);
public void characters (char buf [], int offset, int len)
throws SAXException
accumulator.append(buf, offset, len);
public void endElement (String name)
throws SAXException
if (name.equals("first-name") )
firstname=accumulator.toString().trim();
if (name.equals("last-name"))
lastname=accumulator.toString().trim();
My problem is that i have to store the values of first-name and last-name.
but i have that in both
<authorizer> </authorizer> Tag and
<destination> </destination>
I need to retrive authorizer's firstname,lastname and
destination's firstname and lastname.
what i mean is i need to store authorizerFirstName,authorizerLastName
destinationFirstname and destinationLastname.
Pls let me know how to do that.
Thanks in advance.
Pooja.hi pooja,
I think you are using DataHandler for parsing. Its deprecated. try using contentHandler . You can get the value of the element at the beginning. say for example
<firstname>sdfs</firstname>
the startElement will be firstname
the next method that it invokes will be characters method which has the text associated with the element. I am sending a sample code for your problem. try using it .
boolean m_boolinAuth = false;
boolean m_boolinDest = false;
boolean m_bAuthFName = false;
boolean m_bAuthLName = false;
public void startElement(String namespaceURI, String elementName, String qName, Attributes atts)
//does the logic for startElement
if(qName.equals("Authorization"))
m_boolinAuth = true;
m_boolinDest = false;
else if(qName.equals("Destination"))
m_boolinDest = true;
m_boolinAuth = false;
if(qName.equals("firstname"))
m_bFirstName = true;
if(qName.equals("lastname"))
m_bLastName = true;
public void characters(char[] ch, int start, int length)
//does the logic for characters.
String str = new String(ch,start,length);
if(m_bFirstName)
if(m_boolinAuth)
m_strAuthFirstName =str;
else if(m_boolinDest)
m_strDestFirstName = str;
m_bFirstName = false;
if(m_bLastName)
//same as first name case;
} -
How to parse XML using SAX Parser sequencially
I have a requirement to parse XML file sequencially. But I need to stop the parsing in-between for doing some processing.
Let me explain with example
I have a file with following structure.
<InputFile>
<Invoice>
<InvoiceNo = "Inv1"/>
<InvoiceDt = "12012002"/>
</Invoice>
<Invoice>
<InvoiceNo = "Inv2"/>
<InvoiceDt = "12012002"/>
</Invoice>
<Invoice>
<InvoiceNo = "Inv3"/>
<InvoiceDt = "12012002"/>
</Invoice>
For each Invoice node I need to process some activites. So I need to write a method which will open the XML file and parse and returns me a complete element from <invoice> to </Invoice> sequencially.
Please let me know whther some body has solution for this.
Manoj.If you're using a SAX parser then you can implement your code in the startElement(), endElement(), and characters() methods... have a look at the tutorial here:
http://java.sun.com/xml/jaxp/dist/1.1/docs/tutorial/index.html -
Hi All,
I need to build a custom Adapter Module where i want to use SAX Parsing for parsing XML document. I tried with a piece of Code but i'm getting following error while running the same:
Error occurred while sending message (GUID 6da4ff1c-3736-4990-1881-a8f09edd5fde): null
When i check the Audit Log the i just see following two lines:
Success Channel JDBC_s_Article_Grp1: Query executed successfully and confirmation skipped. Data may be sent again ("TEST" mode)
Send query result. Size: 1398556 characters
There are no logs being created for module at all. Also when i run the same code with DOM parsing, it works perfectly fine.
I have tries with re-deployment multiple times but no result.
Any pointers?
Regards,
Anuragtry to handle exceptions and use logging to know what the issue is.
That is the best way to troubleshoot your code
http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/3bdc14e1-0901-0010-b5a9-a01e29d75a6a?quicklink=index&overridelayout=true
refer section 4.4.2 Writing Audit Logs
Maybe you are looking for
-
Hi guys, does anybody know what's going on with the bug described in the subject? The original notice was: 3632886: [Background Execution][Mobile] Error 3768 is coming when executeInBackground is set to false with notification center pulled down, inc
-
Abend while executing alter system kill session command
I have a ML350 G3 Hp server(Xeon 2.4 Ghz) running oracle 8.1.5 on Novell 5.1. Frequently i have locking problems in my software. So when i tried to kill the active session using alter system kill session 'sid, serial#' my server produce following err
-
I have a great idea for Apple. With a market cap fast approaching 600 billion, Apple should consider expanding their product base. Apple should consider entering the automobile industry. Apple could specialize in an automobile that revolutionizes
-
Photoshop Elements 11 - 'Monitor Profile Defective' Message
When opening Editor in Photoshop Elements 11, I get the warning message "The Monitor profile 'Dell S2240L Colour Profile, D65' appears to be defective. Please rerun your monitor calibration software". I have recently upgraded from Windows 8 to 8.1 an
-
Opening photo cd created on a pc
I am trying to open a photo cd created on a pc. The disk opens fine on my mother-in-law's pc, but when I insert it into my iMac, I get an error message stating that the disk is not readable by my computer. I know that the photo files are in JPEG form