DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT <http://nagoya.apache.org/bugzilla/show_bug.cgi?id=24669>. ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=24669 Internal entities added via addInternalEntity() are lost Summary: Internal entities added via addInternalEntity() are lost Product: Xerces2-J Version: 2.4.0 Platform: Sun OS/Version: Solaris Status: NEW Severity: Normal Priority: Other Component: Other AssignedTo: [EMAIL PROTECTED] ReportedBy: [EMAIL PROTECTED] Hi, We're processing xml documents that contain entity names such as £, ¥ etc. We tried getting a reference to the XMLEntityManager via the property: "http://apache.org/xml/properties/internal/entity-manager". Once we have the reference, we invoke its method addInternalEntity() and load all the entities we want to handle. The issue is that when we invoke the parse() method on the DOMParser object, the newly added internal entities are cleared by the call to reset() all the way in BasicParserConfiguration.java file, when it resets the components. Also noticed a new XMLEntityManager is instantiated during the execution of the parse() method. I have included a test case and test code. We have worked around it by loading them in the reset () method after the fEntities.clear(); is done. I also tried this with 2.5.0 and have the same issue. Regards, Julio Lara import java.io.*; import org.apache.xerces.util.SymbolTable; import org.apache.xerces.parsers.DOMParser; import org.xml.sax.InputSource; import org.apache.xerces.impl.XMLEntityManager; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; public class TestXMLEntityManager { public static void main(String[] args) throws FileNotFoundException, SAXNotRecognizedException, SAXNotSupportedException, IOException, SAXException { Reader xmlReader = new FileReader(args[0]); String xsdFile = args[1]; String namespace = null; // clean Windows path separator, if (null != xsdFile) xsdFile = xsdFile.replace('\\', '/'); if (3 == args.length) namespace = args[2]; DOMParser parser = null; SymbolTable symbolTable = null; CachingGrammarPool grammarPool = new CachingGrammarPool(); parser = new DOMParser(symbolTable, grammarPool); // set features. parser.setFeature("http://xml.org/sax/features/namespaces", true); parser.setFeature("http://xml.org/sax/features/validation", true); parser.setFeature("http://apache.org/xml/features/validation/schema", true); parser.setFeature("http://apache.org/xml/features/validation/schema-full- checking", true); if ((xsdFile != null) && (! xsdFile.equals(""))) { // determine which property to set for schema location if ((namespace != null) && (! namespace.equals(""))) // case: namespace specified parser.setProperty(SCHEMA_WITH_NAMESPACE_LOCATION_PROPERTY, namespace + " " + xsdFile); else // case: no namespace parser.setProperty(TestXMLEntityManager.SCHEMA_LOCATION_PROPERTY, xsdFile); } // get entity manager XMLEntityManager mgr = (XMLEntityManager) parser.getProperty("http://apache.org/xml/properties/internal/entity- manager"); mgr.addInternalEntity("yen", "¥"); parser.parse(new InputSource(xmlReader)); } // constants. public final static String SCHEMA_LOCATION_PROPERTY = org.apache.xerces.impl.Constants.XERCES_PROPERTY_PREFIX + org.apache.xerces.impl.Constants.SCHEMA_NONS_LOCATION; public final static String SCHEMA_WITH_NAMESPACE_LOCATION_PROPERTY = org.apache.xerces.impl.Constants.XERCES_PROPERTY_PREFIX + org.apache.xerces.impl.Constants.SCHEMA_LOCATION; } schema: <?xml version="1.0" encoding="UTF-8"?> <xs:schema targetNamespace="http://ice.wellsfargo.com/ifxlite" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ifxlite="http://ice.wellsfargo.com/ifxlite" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="PingRq"> <xs:complexType> <xs:sequence> <xs:element ref="ifxlite:Msg"/> </xs:sequence> <xs:attribute name="sourceId" type="xs:string" use="required"/> </xs:complexType> </xs:element> <xs:element name="PingRs"> <xs:complexType> <xs:sequence> <xs:element ref="ifxlite:Msg" minOccurs="0"/> </xs:sequence> <xs:attribute name="errorCode" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="OK"/> <xs:enumeration value="ERROR"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="sourceId" type="xs:string" use="required"/> </xs:complexType> </xs:element> <xs:element name="Msg"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="1"/> <xs:maxLength value="37"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="IFX"> <xs:annotation> <xs:documentation>Root of ping request response</xs:documentation> </xs:annotation> <xs:complexType> <xs:choice> <xs:element ref="ifxlite:PingRq"/> <xs:element ref="ifxlite:PingRs"/> </xs:choice> </xs:complexType> </xs:element> </xs:schema> XML document: <?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet type="text/xsl" href="D:\DEVROOT\xml\ping\ping- internalrep.xsl"?> <IFX xmlns="http://ice.wellsfargo.com/ifxlite"> <PingRq sourceId="ICE"> <Msg>Test Ping MU ¥ test </Msg> </PingRq> </IFX> error message: [Fatal Error] :8:26: The entity "yen" was referenced, but not declared. Hit uncaught exception org.xml.sax.SAXParseException org.xml.sax.SAXParseException: The entity "yen" was referenced, but not declared. at org.apache.xerces.parsers.DOMParser.parse(DOMParser.java:263) at com.wellsfargo.ice.utils.TestXMLEntityManager.main (TestXMLEntityManager.java:62) Exception in thread "main" --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
