Generuję niektóre pliki XML, które muszą być zgodne z plikiem xsd, który został mi przekazany. Jaki jest najlepszy sposób sprawdzenia, czy są zgodne?
źródło
Generuję niektóre pliki XML, które muszą być zgodne z plikiem xsd, który został mi przekazany. Jaki jest najlepszy sposób sprawdzenia, czy są zgodne?
Biblioteka środowiska wykonawczego Java obsługuje sprawdzanie poprawności. Ostatnim razem, gdy sprawdziłem, był to parser Apache Xerces pod przykryciem. Prawdopodobnie powinieneś użyć javax.xml.validation.Validator .
import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import java.net.URL;
import org.xml.sax.SAXException;
//import java.io.File; // if you use File
import java.io.IOException;
...
URL schemaFile = new URL("http://host:port/filename.xsd");
// webapp example xsd:
// URL schemaFile = new URL("http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd");
// local file example:
// File schemaFile = new File("/location/to/localfile.xsd"); // etc.
Source xmlFile = new StreamSource(new File("web.xml"));
SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
Schema schema = schemaFactory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.validate(xmlFile);
System.out.println(xmlFile.getSystemId() + " is valid");
} catch (SAXException e) {
System.out.println(xmlFile.getSystemId() + " is NOT valid reason:" + e);
} catch (IOException e) {}
Stała fabryczna schematu to ciąg znaków, http://www.w3.org/2001/XMLSchema
który definiuje XSD. Powyższy kod weryfikuje deskryptor wdrażania WAR względem adresu URLhttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
ale równie dobrze można zweryfikować względem pliku lokalnego.
Nie powinieneś używać DOMParser do sprawdzania poprawności dokumentu (chyba że Twoim celem jest utworzenie modelu obiektu dokumentu i tak). Rozpocznie się tworzenie obiektów DOM podczas analizy dokumentu - marnotrawstwo, jeśli nie zamierzasz ich używać.
Oto jak to zrobić za pomocą Xerces2 . Samouczek na ten temat tutaj (wymagana rejestracja).
Oryginalne uznanie autorstwa: rażąco skopiowane stąd :
źródło
Nasz projekt budujemy za pomocą ant, dzięki czemu możemy użyć zadania schemavalidate do sprawdzenia plików konfiguracyjnych:
Teraz niegrzeczne pliki konfiguracyjne zakończą się niepowodzeniem!
http://ant.apache.org/manual/Tasks/schemavalidate.html
źródło
Ponieważ jest to popularne pytanie, zwrócę uwagę, że java może również sprawdzać poprawność względem „odesłanego” xsd, na przykład jeśli sam plik .xml określa XSD w nagłówku, używając
xsi:SchemaLocation
lubxsi:noNamespaceSchemaLocation
(lub xsi dla określonych przestrzeni nazw) np . :lub SchemaLocation (zawsze lista przestrzeni nazw do odwzorowań xsd)
Tutaj działają również inne odpowiedzi, ponieważ pliki .xsd „mapują” na przestrzenie nazw zadeklarowane w pliku .xml, ponieważ deklarują przestrzeń nazw, a jeśli są zgodne z przestrzenią nazw w pliku .xml, jesteś dobry. Ale czasem wygodnie jest mieć niestandardowy program rozpoznawania nazw ...
Z javadocs: „Jeśli utworzysz schemat bez określania adresu URL, pliku lub źródła, wówczas język Java tworzy taki, który sprawdza dokument w trakcie sprawdzania poprawności w celu znalezienia schematu, którego powinien użyć. Na przykład:”
i działa to w przypadku wielu przestrzeni nazw itp. Problem z tym podejściem polega na tym, że
xmlsns:xsi
prawdopodobnie jest to lokalizacja sieciowa, więc domyślnie wychodzi i trafia do sieci przy każdej walidacji, nie zawsze optymalnej.Oto przykład, który sprawdza poprawność pliku XML względem dowolnych plików XSD, do których się odwołuje (nawet jeśli musi wyciągnąć je z sieci):
Można uniknąć ciągnięcia odwołań XSD z sieci, nawet jeśli pliki xml odwołują się do adresów URL, poprzez ręczne określenie xsd (zobacz kilka innych odpowiedzi tutaj) lub za pomocą resolvera w stylu „katalogu XML” . Wygląda na to, że Spring może również przechwytywać żądania adresów URL w celu udostępniania lokalnych plików do weryfikacji. Lub możesz ustawić własne za pomocą setResourceResolver , np .:
Zobacz także tutaj, aby zapoznać się z innym samouczkiem.
Wierzę domyślnym jest użycie DOM parsowania, można zrobić coś podobnego z parsera SAX, który jest zatwierdzającego oraz
saxReader.setEntityResolver(your_resolver_here);
źródło
setResourceResolver
ale poza tym, może otwórz nowe pytanie ...Za pomocą Java 7 możesz postępować zgodnie z dokumentacją zawartą w opisie pakietu .
źródło
parser.parse(new File("instance.xml"))
.validator
AkceptujeSource
, więc można:validator.validate(new StreamSource(new File("instance.xml")))
.ErrorHandler
jeśli konieczne jest sprawdzenie poprawności.Jeśli masz maszynę z systemem Linux, możesz skorzystać z bezpłatnego narzędzia wiersza polecenia SAXCount. Uważam to za bardzo przydatne.
Sprawdza się względem dtd i xsd. 5s dla pliku 50 MB.
W debian squeeze znajduje się w pakiecie „libxerces-c-samples”.
Definicja dtd i xsd musi znajdować się w xml! Nie można ich konfigurować osobno.
źródło
xmllint --schema phone.xsd phone.xml
(z odpowiedzi 13ren)Jeszcze jedna odpowiedź: skoro powiedziałeś, że musisz sprawdzić poprawność generowanych plików (piszesz), możesz chcieć sprawdzić poprawność treści podczas pisania, zamiast najpierw pisać, a potem czytać w celu sprawdzenia poprawności. Prawdopodobnie możesz to zrobić za pomocą JDK API do sprawdzania poprawności Xml, jeśli używasz programu piszącego opartego na SAX: jeśli tak, po prostu połącz w walidatorze, wywołując „Validator.validate (źródło, wynik)”, gdzie źródło pochodzi od twojego pisarza, a wynikiem jest gdzie wyjście musi iść.
Alternatywnie, jeśli używasz Stax do pisania treści (lub biblioteki, która używa lub może używać stax), Woodstox może również bezpośrednio obsługiwać sprawdzanie poprawności przy użyciu XMLStreamWriter. Oto wpis na blogu pokazujący, jak to zrobić:
źródło
Jeśli programowo generujesz pliki XML, możesz zajrzeć do biblioteki XMLBeans . Za pomocą narzędzia wiersza poleceń XMLBeans automatycznie wygeneruje i spakuje zestaw obiektów Java na podstawie XSD. Następnie można użyć tych obiektów do zbudowania dokumentu XML na podstawie tego schematu.
Ma wbudowaną obsługę sprawdzania poprawności schematu i może konwertować obiekty Java na dokument XML i odwrotnie.
Castor i JAXB to inne biblioteki Java, które służą podobnym celom jak XMLBeans.
źródło
Dzięki JAXB możesz użyć poniższego kodu:
źródło
Szukasz narzędzia lub biblioteki?
Jeśli chodzi o biblioteki, de facto standardem jest Xerces2, który ma zarówno wersje C ++, jak i Java .
Ostrzegam jednak, że jest to rozwiązanie ciężkie. Ale z drugiej strony sprawdzanie poprawności XML względem plików XSD jest dość dużym problemem.
Jeśli chodzi o narzędzie do zrobienia tego dla ciebie, XMLFox wydaje się być przyzwoitym darmowym rozwiązaniem, ale nie użyłem go osobiście, nie mogę powiedzieć na pewno.
źródło
Sprawdź poprawność pod kątem schematów online
Sprawdź poprawność względem lokalnych schematów
Offline XML Validation with Java
źródło
Za pomocą Woodstox skonfiguruj analizator składni StAX, aby sprawdzić poprawność względem schematu i przeanalizuj XML.
Jeśli wychwycone zostaną wyjątki, kod XML jest niepoprawny, w przeciwnym razie jest poprawny:
Uwaga : jeśli musisz sprawdzić poprawność wielu plików, powinieneś spróbować ponownie użyć swojego
XMLInputFactory
iXMLValidationSchema
, aby zmaksymalizować wydajność.źródło
Musiałem tylko raz sprawdzić XML względem XSD, więc wypróbowałem XMLFox. Uważam, że jest to bardzo mylące i dziwne. Wydawało się, że instrukcje pomocy nie pasują do interfejsu.
Skończyło się na użyciu LiquidXML Studio 2008 (v6), które było znacznie łatwiejsze w użyciu i od razu bardziej znane (interfejs użytkownika jest bardzo podobny do Visual Basic 2008 Express, z którego często korzystam). Wada: funkcja sprawdzania poprawności nie jest dostępna w wersji bezpłatnej, więc musiałem skorzystać z 30-dniowej wersji próbnej.
źródło