2010-10-22 7 views
16

Esiste un'API Java per analizzare un file di schema XSD?API Java per analizzare file di schema XSD

Ho trovato XSOM, ma non sembra essere più mantenuto.

+3

Che cosa vuoi realizzare? Qualsiasi parser XML analizzerà un XSD, è solo un file XML. –

+0

So che lo è :) Ho bisogno di caricare i vincoli di restrizione associati ai tipi di schema. Quindi ho bisogno di convertirli in regole di sistema di validazione in-house. E poi convalidare alcune complesse strutture di oggetti Java usando queste regole. Credimi non farò domande qui se ho solo bisogno di analizzare semplici file XSD o convalidare XML contro lo schema. –

+0

Vedere anche http://stackoverflow.com/questions/533573/analyzing-xml-schemas-using-org-eclipse-xsd-and-maven2 – rds

risposta

18

Utilizzando JDK di serie 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

ha dimenticato di menzionare che l'accesso a queste classi è limitato. Lo uso solo per gli strumenti; non so se puoi usarlo in fase di runtime. – emicklei

+0

Questo è esattamente quello che stavo cercando. Grazie :) –

+1

Funziona anche senza modificare globalmente il parser DOM: XSImplementation impl = new XSImplementationImpl(); – koppor

4

Abbiamo tendenzialmente utilizzato Apache Xerces http://xerces.apache.org/. Funziona davvero bene per noi.

+2

Basta analizzare il file XSD? Tale approccio è molto complicato quando il file dello schema contiene molte dichiarazioni di tipi composti e complessi. –

0

Come accennato, uno schema è esso stesso XML valido. Per cosa vuoi caricarlo, convalida? In tal caso, nel pacchetto javax.xml.validation sono disponibili alcune classi pratiche.

+0

Per la convalida, ma non per la convalida del file XML. Devo estrarre tutti i tipi di dati da XSD e quindi esportare le restrizioni associate agli elementi al sistema di convalida esterno. –

1

JAXB

Vai a questa question

+0

Oppure dai un'occhiata a JAXP (https://jaxp.dev.java.net /) – Marcus

+0

Non voglio legare XML né analizzare XSD a mano (cioè con JAXP). Ho bisogno dell'API per esplorare la struttura XSD, i tipi di lista definiti nello Schema e tutte le restrizioni ad essi associati. So di poter analizzare XSD con JAXP, ma per schemi molto complessi potrebbe esserci dolore negli a * s. –

+0

Come altri hanno già detto, XSD è solo un documento XML valido. Usa un parser DOM, se hai intenzione di aggiornarlo o di doverlo navigare in ordine non sequenziale. Un parser SAX sarebbe molto efficace se si desidera estrarre gli elementi in ordine sequenziale e non dovrebbe essere difficile scrivere, anche per xml lungo/complesso, specialmente se si stanno solo estraendo i tipi e le restrizioni. E dal commento che hai fatto nel tuo post originale, penso che starai meglio scrivendo un parser SAX e convertendolo in regole di convalida interne. – Marcus

0

Dipende che cosa i vostri requisiti specifici sono. This page offre una buona panoramica delle principali opzioni e dei casi d'uso che supportano.

Una cosa a cui pensare: A seconda della piattaforma si sta distribuendo da e per altri framework in uso, ci potrebbe essere già varie API nel vostro albero delle dipendenze (xerces è particolarmente comune in App server per esempio). Fai attenzione ai conflitti di versione che possono essere un incubo per isolare e eseguire il debug.

+0

Se ti piacciono le API standard, sei molto più sicuro. Ad esempio, gestisci Xerces come parser JAXP anziché APIS nativo. In questo modo, se porti a un altro framework e stai utilizzando un'altra implementazione JAXP, sei ancora al sicuro. –

+0

Si prega di fare riferimento al commento che ho scritto alla domanda. Non ho bisogno dell'API di analisi XML. –

2

Prova EasyWSDL - è in grado di analizzare sia XSD uno specifiche WSDL.

+0

Puoi condividere alcuni dati di lettura del codice da XSD? Ricevo un errore "Versione sconosciuta di wsdl" durante il caricamento del file XSD. – Ajeesh

3

È possibile utilizzare XMLBeans http://xmlbeans.apache.org. Per la maggior parte dei casi di utilizzo attorno a XML/Java, le persone sembrano passare a JAXB da quando è integrato. Ma per ciò che si vuole fare, XMLBeans fornisce accesso ad alcune strutture di dati di alto livello che rappresentano schemae in un modo facile attraversare.

Si può iniziare con qualcosa di simile ...

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

Da lì si dovrebbe essere in grado di capire come forare lo SchemaTypeSystem dal JavaDoc.

Se qualcuno sa di un'alternativa altrettanto comoda e relativamente supportata, sarebbe bello saperlo. Sto guardando attivamente.

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

ciao questo è il modo semplice per analizzare un file xsd .. –

+0

definizioni del pacchetto sarebbe bello .... – Nenotlep

+0

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