2010-10-22 25 views
16

¿Hay una API Java para analizar un archivo de esquema XSD?API Java para analizar el archivo de esquema XSD

Encontré XSOM, pero parece que ya no se mantiene.

+3

¿Qué desea lograr? Cualquier analizador XML analizará un XSD, es solo un archivo XML. –

+0

Sé que es :) Necesito cargar restricciones de restricción asociadas con los tipos de esquema. Entonces necesito convertirlos a las reglas del sistema de validación en la casa. Y luego valida algunas estructuras complejas de objetos Java usando estas reglas. Créanme que no haré preguntas aquí si solo tuviera que analizar un archivo XSD simple o validar XML con el esquema. –

+0

Vea también http://stackoverflow.com/questions/533573/analyzing-xml-schemas-using-org-eclipse-xsd-and-maven2 – rds

Respuesta

18

El uso de JDK estándar de 6:

System.setProperty(DOMImplementationRegistry.PROPERTY, "com.sun.org.apache.xerces.internal.dom.DOMXSImplementationSourceImpl"); 
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance(); 
com.sun.org.apache.xerces.internal.impl.xs.XSImplementationImpl impl = (XSImplementationImpl) registry.getDOMImplementation("XS-Loader"); 
XSLoader schemaLoader = impl.createXSLoader(null); 
XSModel model = schemaLoader.loadURI("src/test/resources/my.xsd"); 
+0

se olvidó de mencionar que el acceso a estas clases está restringido. Lo uso solo para herramientas; no sé si puedes usar esto en tiempo de ejecución. – emicklei

+0

Eso es exactamente lo que estaba buscando. Gracias :) –

+1

También funciona sin cambiar globalmente el analizador DOM: XSImplementation impl = new XSImplementationImpl(); – koppor

4

Hemos tendido a utilizar Apache Xerces http://xerces.apache.org/. Funciona muy bien para nosotros.

+2

¿Solo analiza el archivo XSD? Tal enfoque es muy complicado cuando su archivo de esquema contiene muchas declaraciones de tipos compuestos y complejos. –

0

Como se mencionó, un esquema es en sí mismo XML válido. ¿Para qué quieres cargarlo, validación? Si es así, hay algunas clases útiles en el paquete javax.xml.validation.

+0

Para la validación, pero no para la validación del archivo XML. Necesito extraer todos los tipos de datos de XSD y luego exportar las restricciones asociadas con los elementos al sistema de validación externo. –

1

JAXB

ver este question

+0

O echa un vistazo a JAXP (https://jaxp.dev.java.net /) – Marcus

+0

No quiero vincular XML ni analizar XSD a mano (es decir, con JAXP). Necesito una API para explorar la estructura XSD, enumerar los tipos definidos en el esquema y todas las restricciones asociadas a ellos. Sé que puedo analizar XSD con JAXP, pero para esquemas muy complejos puede ser doloroso en el a * s. –

+0

Como han dicho otros, XSD es solo un documento XML válido. Use un analizador DOM, si va a actualizarlo o necesita navegarlo en orden no secuencial. Un analizador SAX sería muy eficiente si desea extraer elementos en orden secuencial, y no debería ser difícil escribir, incluso para xml largo/complejo, especialmente si solo está extrayendo los tipos y restricciones. Y por el comentario que hizo en su publicación original, creo que es mejor que solo escriba un analizador de SAX y lo convierta en sus reglas de validación internas. – Marcus

0

depende de lo que son sus necesidades específicas. This page ofrece una buena visión general de las principales opciones y los casos de uso que admiten.

Una cosa a tener en cuenta: según la plataforma en la que esté desplegando y otros marcos que esté utilizando, puede haber varias API en su árbol de dependencias (xerces es particularmente común en Servidores de aplicaciones, por ejemplo). Tenga cuidado con los conflictos de versiones que pueden ser una pesadilla para aislar y depurar.

+0

Si te apegas a las API estándar, estás mucho más seguro. Por ejemplo, trate Xerces como un analizador JAXP en lugar de APIS nativo. De esta manera, si transfiere el puerto a otro marco y está usando otra implementación de JAXP, todavía está a salvo. –

+0

Consulte el comentario que escribí a la pregunta. No necesito API de análisis XML. –

2

Trate EasyWSDL - se puede analizar tanto XSD un especificaciones WSDL.

+0

¿Puede compartir algún código leyendo datos de XSD? Recibo un error "Versión desconocida de wsdl" al cargar el archivo XSD. – Ajeesh

3

Puede usar XMLBeans http://xmlbeans.apache.org. Para la mayoría de los casos de uso en XML/Java, las personas que se vinculan parecen estar moviéndose a JAXB, ya que están integradas. Pero lo que quiere hacer, XMLBeans proporciona acceso a algunas estructuras de datos de alto nivel que representan esquemas de una manera fácil. atravesar.

Puede comenzar con algo así como ...

SchemaTypeSystem sts = XmlBeans.compileXsd(new XmlObject[] { 
    XmlObject.Factor.parse(xsdFile) }, XmlBeans.getBuiltInTypeSystem(), null); 

Desde allí se debe ser capaz de encontrar la manera de perforar en el SchemaTypeSystem del JavaDoc.

Si alguien sabe de una alternativa que es tan conveniente y relativamente compatible, sería genial saberlo. Estoy buscando activamente.

2
public class XsdElements { 
    public static void main(String args[]) { 
     try { 
      // parse the document 
      DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
      Document doc = docBuilder.parse (new File("C:/Users/rb054/Desktop/Descriptor.1.5.1.xsd")); 
      NodeList list = doc.getElementsByTagName("xs:element"); 

      //loop to print data 
      for(int i = 0 ; i < list.getLength(); i++) 
      { 
       Element first = (Element)list.item(i); 
       if(first.hasAttributes()) 
       { 
        String nm = first.getAttribute("name"); 
        System.out.println(nm); 
        String nm1 = first.getAttribute("type"); 
        System.out.println(nm1); 
       } 
      } 
     } 
     catch (ParserConfigurationException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (SAXException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IOException ed) 
     { 
      ed.printStackTrace(); 
     } 
    } 
} 
+1

hola esta es la forma simple de analizar un archivo xsd .. –

+0

las definiciones de paquetes serían agradables .... – Nenotlep

+0

@Nenotlep org.w3c.dom.Document, org.w3c.dom.Element, org.w3c.dom.NodeList –

Cuestiones relacionadas