Tengo un wsdl que contiene elementos de solicitud y respuesta:
<xsd:element name="someRequest" type="ns:SomeRequest"/> <xsd:element name="someResponse" type="ns:SomeResponse"/>Este wsdl importa algunos xsd, que contienen, entre otros, estos tipos complejos:
<xsd:complexType name="SomeRequest"> ... </xsd:complexType> <xsd:complexType name="SomeResponse"> ... </xsd:complexType>Quiero validar un xml contra este wsdl, pero no puedo hacerlo funcionar. Básicamente estoy usando el método descrito en http://actimem.com/java/jaxb-validation/#Marshalling_Validation , ordenando el objeto y configurando un esquema y un controlador de eventos.
Si configuro el esquema en el xsd, no se validará porque no hay ningún elemento en el xsd. Esto es bastante lógico, obtengo lo mismo con otras herramientas. Cuando uso wsdl como esquema, aparece este error debido a la documentación en línea:
s4s-elt-character: Non-whitespace characters are not allowed in schema elements other than 'xs:appinfo' and 'xs:documentation'.¿Hay alguna forma de hacer que esto se valide?
Como estoy trabajando en proyectos existentes (actualmente usando Xmlbeans en lugar de JAXB) con un flujo de trabajo establecido, tengo que trabajar con algunas restricciones:
Intenté transformar el esquema para agregar el elemento manualmente, pero no puedo encontrar la manera de hacerlo en un objeto de esquema existente. Si hago esto a través de la manipulación DOM, obtengo el nuevo esquema como un objeto String, que no se analizará en un esquema porque no se pueden encontrar los xsd importados.
Si copio los xsd del jar al proyecto, puedo transformarlos y obtener la validación para tener éxito, pero realmente no me gusta esta solución. Si no hay otra forma, volveré a eso, pero me gustaría encontrar una solución que requiera el menor trabajo posible al reutilizar este método y que sea menos propensa a errores. Otros desarrolladores usarán este código y 1 método de validación sin necesidad de pasos adicionales para funcionar sería perfecto.
Me encontré básicamente con este problema antes y tampoco encontré una solución. Pero antes, complexType no era el elemento raíz y podía envolverlo en otros objetos hasta que encontraba un objeto que estaba representado como elemento en el xsd.
Puede considerar mirar la clase javax.xml.validation.Validator . Hay una manera de crearlo para el esquema en el documento WSDL y luego tendrá su elemento someRequest que puede validar contra ese esquema.
el código puede parecerse a:
import javax.xml.transform.Source; import javax.xml.transform.dom.DOMSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import org.xml.sax.ErrorHandler; ... DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); String testXml = "{your XML document}" Document domDoc = docBuilder.parse(new ByteArrayInputStream(testXml.getBytes())); Source inputSource = new DOMSource(domDoc); Validator validator = requestedSchema.newValidator(); MySchemaValidationErrorHandler errHandler = new MySchemaValidationErrorHandler(); SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema requestedSchema = schemaFactory.newSchema({DOMSource from WSDL document/types/xsd:schema node})); validator.setErrorHandler(errHandler); validator.validate(inputSource); Tenga en cuenta que debe tener su propia implementación de la interfaz org.xml.sax.ErrorHandler donde se recopilarán todas las advertencias y errores durante la validación.
En general, no es difícil hacer todo eso. Solo necesitas
schemaFactory.newSchema(...)org.xml.sax.ErrorHandler donde se recopilan todos los errores. Es muy simplePD. Por lo general, creo los esquemas necesarios una vez y los guardo en el mapa. Solo tenga en cuenta: el validador no es seguro para subprocesos.
por supuesto, puede usar cualquier otra implementación de javax.xml.transform.Source , no solo DOMSource