2008-12-24 6 views
1

En traitement Java SAX, je n'arrive pas à obtenir les noms de référence d'entité à partir de la méthode org.xml.sax.ext.EntityResolver2 resolveEntity. L'argument de nom est toujours null même si la documentation indique que 'name' is never null when invoked by a SAX2 parser.Comment puis-je obtenir un argument de nom non nul avec la méthode org.xml.sax.ext.EntityResolver2 resolveEntity?

Une idée?

Pour démontrer le problème, j'ai créé un script Jython 2.5. Il imprime (sur ma boîte):

Entity Resolver 2 enabled: True 
Entity name: None 

script Jython 2.5:

# Jython 
from org.python.core.util import StringUtil 
from jarray import array 

# Java Standard Edition 
from org.xml.sax import * 
from org.xml.sax.ext import * 
from org.xml.sax.helpers import * 
from java.io import ByteArrayInputStream 

xml = """\ 
<!DOCTYPE doc 
[<!ENTITY entity SYSTEM "entity-file"> 
]> 
<doc>&entity;</doc> 
""" 

def empty_source(): 
    _source = InputSource() 
    byte_stream = ByteArrayInputStream(array([], "b")) 
    _source.setByteStream(byte_stream) 
    return _source 

class Handler(EntityResolver2): 
    def getExternalSubset(self, name, baseURI): 
     return None 
    def resolveEntity(self, name, publicId, baseURI, systemId): 
     print "Entity name:", name 
     return empty_source() 

reader = XMLReaderFactory.createXMLReader() 
enabled = reader.getFeature("http://xml.org/sax/features/use-entity-resolver2") 
print "Entity Resolver 2 enabled:", enabled 

handler = Handler() 
reader.setEntityResolver(handler) 
bytes = StringUtil.toBytes(xml) 
byte_stream = ByteArrayInputStream(bytes) 
source = InputSource(byte_stream) 
reader.parse(source) 

Répondre

0

Utilisez une version plus récente de Xerces (2.9.1 par exemple), au lieu de la "vieille" livré avec un Java.

Questions connexes