Implemented support for default Namespaces
This commit is contained in:
parent
a0237d6035
commit
6726c92b40
@ -16,8 +16,8 @@ public class FeedHandler {
|
|||||||
|
|
||||||
public Feed parseFeed(Feed feed) {
|
public Feed parseFeed(Feed feed) {
|
||||||
TypeGetter tg = new TypeGetter();
|
TypeGetter tg = new TypeGetter();
|
||||||
tg.getType(feed);
|
TypeGetter.Type type = tg.getType(feed);
|
||||||
SyndHandler handler = new SyndHandler(feed);
|
SyndHandler handler = new SyndHandler(feed, type);
|
||||||
try {
|
try {
|
||||||
SAXParserFactory factory = SAXParserFactory.newInstance();
|
SAXParserFactory factory = SAXParserFactory.newInstance();
|
||||||
factory.setNamespaceAware(true);
|
factory.setNamespaceAware(true);
|
||||||
|
@ -17,11 +17,13 @@ public class HandlerState {
|
|||||||
protected Stack<SyndElement> tagstack;
|
protected Stack<SyndElement> tagstack;
|
||||||
/** Namespaces that have been defined so far. */
|
/** Namespaces that have been defined so far. */
|
||||||
protected HashMap<String, Namespace> namespaces;
|
protected HashMap<String, Namespace> namespaces;
|
||||||
|
protected Stack<Namespace> defaultNamespaces;
|
||||||
|
|
||||||
public HandlerState(Feed feed) {
|
public HandlerState(Feed feed) {
|
||||||
this.feed = feed;
|
this.feed = feed;
|
||||||
tagstack = new Stack<SyndElement>();
|
tagstack = new Stack<SyndElement>();
|
||||||
namespaces = new HashMap<String, Namespace>();
|
namespaces = new HashMap<String, Namespace>();
|
||||||
|
defaultNamespaces = new Stack<Namespace>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,15 +12,18 @@ import de.podfetcher.syndication.namespace.SyndElement;
|
|||||||
import de.podfetcher.syndication.namespace.atom.NSAtom;
|
import de.podfetcher.syndication.namespace.atom.NSAtom;
|
||||||
import de.podfetcher.syndication.namespace.rss20.NSRSS20;
|
import de.podfetcher.syndication.namespace.rss20.NSRSS20;
|
||||||
|
|
||||||
// TODO implement default namespace
|
|
||||||
/** Superclass for all SAX Handlers which process Syndication formats */
|
/** Superclass for all SAX Handlers which process Syndication formats */
|
||||||
public class SyndHandler extends DefaultHandler {
|
public class SyndHandler extends DefaultHandler {
|
||||||
private static final String TAG = "SyndHandler";
|
private static final String TAG = "SyndHandler";
|
||||||
|
private static final String DEFAULT_PREFIX = "";
|
||||||
protected HandlerState state;
|
protected HandlerState state;
|
||||||
|
|
||||||
public SyndHandler(Feed feed) {
|
public SyndHandler(Feed feed, TypeGetter.Type type) {
|
||||||
state = new HandlerState(feed);
|
state = new HandlerState(feed);
|
||||||
state.namespaces.put("", new NSRSS20()); // TODO remove later
|
if (type == TypeGetter.Type.RSS20) {
|
||||||
|
state.defaultNamespaces.push(new NSRSS20());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -28,6 +31,9 @@ public class SyndHandler extends DefaultHandler {
|
|||||||
Attributes attributes) throws SAXException {
|
Attributes attributes) throws SAXException {
|
||||||
|
|
||||||
Namespace handler = state.namespaces.get(uri);
|
Namespace handler = state.namespaces.get(uri);
|
||||||
|
if (handler == null && uri.equals(DEFAULT_PREFIX) && !state.defaultNamespaces.empty()) {
|
||||||
|
handler = state.defaultNamespaces.peek();
|
||||||
|
}
|
||||||
if (handler != null) {
|
if (handler != null) {
|
||||||
handler.handleElementStart(localName, state, attributes);
|
handler.handleElementStart(localName, state, attributes);
|
||||||
state.tagstack.push(new SyndElement(localName, handler));
|
state.tagstack.push(new SyndElement(localName, handler));
|
||||||
@ -50,6 +56,9 @@ public class SyndHandler extends DefaultHandler {
|
|||||||
public void endElement(String uri, String localName, String qName)
|
public void endElement(String uri, String localName, String qName)
|
||||||
throws SAXException {
|
throws SAXException {
|
||||||
Namespace handler = state.namespaces.get(uri);
|
Namespace handler = state.namespaces.get(uri);
|
||||||
|
if (handler == null && uri.equals(DEFAULT_PREFIX) && !state.defaultNamespaces.empty()) {
|
||||||
|
handler = state.defaultNamespaces.peek();
|
||||||
|
}
|
||||||
if (handler != null) {
|
if (handler != null) {
|
||||||
handler.handleElementEnd(localName, state);
|
handler.handleElementEnd(localName, state);
|
||||||
state.tagstack.pop();
|
state.tagstack.pop();
|
||||||
@ -69,8 +78,12 @@ public class SyndHandler extends DefaultHandler {
|
|||||||
Log.d(TAG, "Found Prefix Mapping with prefix " + prefix + " and uri "
|
Log.d(TAG, "Found Prefix Mapping with prefix " + prefix + " and uri "
|
||||||
+ uri);
|
+ uri);
|
||||||
// Find the right namespace
|
// Find the right namespace
|
||||||
if (prefix.equals(NSAtom.NSTAG) || uri.equals(NSAtom.NSURI)) {
|
if (uri.equals(NSAtom.NSURI)) {
|
||||||
state.namespaces.put(uri, new NSAtom());
|
if (prefix.equals(DEFAULT_PREFIX)) {
|
||||||
|
state.defaultNamespaces.push(new NSAtom());
|
||||||
|
} else if (prefix.equals(NSAtom.NSTAG)) {
|
||||||
|
state.namespaces.put(uri, new NSAtom());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user