2010-10-22 24 views
16

Czy istnieje Java API do parsowania pliku schematu XSD?Java API do parsowania pliku schematu XSD

Znalazłem XSOM, ale nie wydaje się już być utrzymywane.

+3

Co chcesz osiągnąć? Każdy analizator składni XML przeanalizuje XSD, to tylko plik XML. –

+0

Wiem, że to :) Potrzebuję załadować ograniczenia ograniczeń związanych z typami schematu. Następnie muszę je przekonwertować na wewnętrzne reguły systemu sprawdzania poprawności. Następnie sprawdź poprawność niektórych złożonych struktur obiektów Java, korzystając z tych reguł. Uwierz mi, że nie zadam tutaj pytania, czy po prostu potrzebuję parsować prosty plik XSD, czy zweryfikować XML w stosunku do schematu. –

+0

Zobacz także http://stackoverflow.com/questions/533573/analyzing-xml-schemas-using-org-eclipse-xsd-and-maven2 – rds

Odpowiedz

18

Używając standardowego JDK 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

zapomniałem wspomnieć, że dostęp do tych klas jest ograniczony. Używam tego tylko do oprzyrządowania; nie wiem, czy możesz użyć tego w czasie wykonywania. – emicklei

+0

Tego właśnie szukałem. Dzięki :) –

+1

Działa również bez globalnej zmiany parsera DOM: XSImplementation impl = new XSImplementationImpl(); – koppor

4

Mamy tendencję do używania Apache Xerces http://xerces.apache.org/. Działa bardzo dobrze dla nas.

+2

Po prostu przeanalizuj plik XSD? Takie podejście jest bardzo skomplikowane, gdy plik schematu zawiera wiele złożonych i złożonych deklaracji typów. –

0

Jak już wspomniano, schemat sam w sobie jest prawidłowym kodem XML. Do czego chcesz go załadować, sprawdzanie poprawności? Jeśli tak, to jest kilka przydatnych klas w pakiecie javax.xml.validation.

+0

Do sprawdzania poprawności, ale nie do sprawdzania poprawności pliku XML. Należy wyodrębnić wszystkie typy danych z XSD, a następnie wyeksportować ograniczenia związane z elementami do zewnętrznego systemu sprawdzania poprawności. –

1

JAXB

Zobacz ten question

+0

Lub spójrz na JAXP (https://jaxp.dev.java.net /) – Marcus

+0

Nie chcę powiązania XML ani parsować XSD ręcznie (np. z JAXP). Potrzebuję API do przeglądania struktury XSD, typów list zdefiniowanych w Schemie i wszystkich ograniczeń z nimi związanych. Wiem, że mogę parsować XSD z JAXP ale dla bardzo złożonych schematów może być ból w a * s. –

+0

Jak powiedzieli inni, XSD to tylko poprawny dokument XML. Użyj parsera DOM, jeśli zamierzasz go zaktualizować lub musisz nawigować po nim w niesekwencyjnej kolejności. Parser SAX byłby bardzo wydajny, jeśli chcesz wyodrębnić elementy w kolejności sekwencyjnej i nie powinno być trudne pisanie, nawet dla długich/złożonych xml - szczególnie, jeśli po prostu wyodrębniasz typy i ograniczenia. I z komentarza wprowadzonego w oryginalnym poście, myślę, że lepiej jest napisać parser SAX i przekonwertować go do wewnętrznych reguł sprawdzania poprawności. – Marcus

0

Zależy co swoje specyficzne wymagania. This page daje dobry przegląd głównych opcji i przypadków użycia, które obsługują.

Jedna rzecz do przemyślenia: w zależności od platformy, na której wdrażasz i innych frameworków, z których korzystasz, w twoim drzewie zależności mogą znajdować się już różne interfejsy API (na przykład Xerces jest powszechny na przykład w AppServer). Uważaj na konflikty wersji, które mogą być koszmarem do izolacji i debugowania.

+0

Jeśli trzymasz się standardowych interfejsów API, jesteś o wiele bezpieczniejszy. Na przykład radzimy sobie z Xerces jako analizatorem składni JAXP zamiast natywnego APIS. W ten sposób, jeśli przeniesiesz się do innej struktury i używasz innej implementacji JAXP, nadal jesteś bezpieczny. –

+0

Proszę odnieść się do komentarza, który napisałem na pytanie. Nie potrzebuję API do analizowania XML. –

2

Spróbuj EasyWSDL - można go analizować zarówno XSD e specyfikacji WSDL.

+0

Czy możesz podzielić się niektórymi danymi odczytu kodu z XSD? Podczas wczytywania pliku XSD pojawia się błąd "Nieznana wersja pliku wsdl". – Ajeesh

3

Możesz użyć XMLBeans http://xmlbeans.apache.org. W większości przypadków związanych z powiązaniami XML/Java ludzie przenoszą się do JAXB, ponieważ jest on wbudowany. Ale dla tego, co chcesz zrobić, XMLBeans zapewnia dostęp do niektórych wysokopoziomowych struktur danych, które reprezentują schematy w sposób łatwy do trawers.

Można zacząć od czegoś jak ...

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

Stamtąd powinieneś być w stanie dowiedzieć się, jak drążenie do SchemaTypeSystem z JavaDoc.

Jeśli ktoś zna alternatywę, która jest równie wygodna i względnie obsługiwana, dobrze byłoby o niej wiedzieć. Aktywnie patrzę.

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

Witam, to jest prosty sposób na parsowanie pliku xsd. –

+0

Definicja pakietu byłaby miła ... – Nenotlep

+0

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

Powiązane problemy