org.cybergarage.xml.parser.JaxpParser Maven / Gradle / Ivy
/******************************************************************
*
* CyberXML for Java
*
* Copyright (C) Satoshi Konno 2004
*
* Author: Markus Thurner (http://thoean.com)
*
* File: JaxpParser.java
*
* Revision;
*
* 06/15/04
* - first revision.
* 01/08/08
* - Fixed parse() not to occur null exception when the NamedNodeMap is null on Android.
* 02/08/08
* - Change parse() to use Node::addValue() instead of the setValue().
*
******************************************************************/
package org.cybergarage.xml.parser;
import java.io.ByteArrayInputStream;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.cybergarage.xml.Node;
import org.cybergarage.xml.Parser;
import org.cybergarage.xml.ParserException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
public class JaxpParser extends Parser
{
public JaxpParser()
{
super();
}
////////////////////////////////////////////////
// parse (Node)
////////////////////////////////////////////////
public org.cybergarage.xml.Node parse(org.cybergarage.xml.Node parentNode, org.w3c.dom.Node domNode, int rank)
{
int domNodeType = domNode.getNodeType();
// if (domNodeType != Node.ELEMENT_NODE)
// return;
String domNodeName = domNode.getNodeName();
String domNodeValue = domNode.getNodeValue();
NamedNodeMap attrs = domNode.getAttributes();
int arrrsLen = (attrs != null) ? attrs.getLength() : 0;
// Debug.message("[" + rank + "] ELEM : " + domNodeName + ", " + domNodeValue + ", type = " + domNodeType + ", attrs = " + arrrsLen);
if (domNodeType == org.w3c.dom.Node.TEXT_NODE) {
// Change to use Node::addValue() instead of the setValue(). (2008/02/07)
//parentNode.setValue(domNodeValue);
parentNode.addValue(domNodeValue);
return parentNode;
}
if (domNodeType != org.w3c.dom.Node.ELEMENT_NODE)
return parentNode;
org.cybergarage.xml.Node node = new org.cybergarage.xml.Node();
node.setName(domNodeName);
node.setValue(domNodeValue);
if (parentNode != null)
parentNode.addNode(node);
NamedNodeMap attrMap = domNode.getAttributes();
if (attrMap != null) {
int attrLen = attrMap.getLength();
//Debug.message("attrLen = " + attrLen);
for (int n = 0; n' and '<',
* which isn't so hard if we assume no CDATA.
*/
private static class NullFilterInputStream extends FilterInputStream {
public NullFilterInputStream(InputStream is) {
super(is);
}
@Override
public int read() throws IOException {
int rv;
while ((rv = super.read()) == 0) {
// try again
}
return rv;
}
/** @since 0.9.22 */
@Override
public int read(byte[] b) throws IOException {
return this.read(b, 0, b.length);
}
/** @since 0.9.22 */
@Override
public int read(byte[] b, int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}
int rv = this.read();
if (-1 == rv) {
return -1;
}
int i = 1;
b[off] = (byte) rv;
for (; i < len; i++) {
rv = this.read();
if (-1 == rv) {
break;
}
b[off + i] = (byte) rv;
}
return i;
}
}
/**
* I2P -
* http://stackoverflow.com/questions/5883542/disable-xml-validation-based-on-external-dtd-xsd
*/
private static class BlankingResolver implements EntityResolver {
private static final byte[] DUMMY = new byte[0];
public InputSource resolveEntity(String arg0, String arg1) {
return new InputSource(new ByteArrayInputStream(DUMMY));
}
}
}