Strumento di convalida XML Schema (XSD)? [chiuso]


266

In ufficio stiamo attualmente scrivendo un'applicazione che genererà file XML su uno schema che ci è stato dato. Abbiamo lo schema in un file .XSD.

Esistono strumenti o librerie che possiamo utilizzare per i test automatici per verificare che l'XML generato corrisponda allo schema?

Preferiremmo strumenti gratuiti appropriati per l'uso commerciale, anche se non raggrupperemo il controllo dello schema, quindi deve essere utilizzabile dagli sviluppatori durante lo sviluppo.

Il nostro linguaggio di sviluppo è C ++ se questo fa alcuna differenza, anche se non credo che dovrebbe, in quanto potremmo generare il file XML e quindi effettuare la convalida chiamando un programma separato nel test.


132
Adoro quante di queste domande "non costruttive" sono i principali risultati di ricerca di Google delle cose che cerco e le risposte sono utili
matt freake

1
Capisco da dove viene con il non costruttivo. Onestamente, anche se questa è una grande domanda e il dibattito / argomenti a volte finiscono per ottenere grandi risposte
Matt

22
questo è il caso esatto in cui gli amministratori sono controproducenti
anon58192932

Vale forse la pena dare un'occhiata a una domanda simile nel contesto dello strumento di costruzione Maven .
Alberto,

Risposte:


239

Dopo alcune ricerche, penso che la migliore risposta sia Xerces , in quanto implementa tutta XSD, è multipiattaforma e ampiamente utilizzata. Ho creato un piccolo progetto Java su github per convalidare dalla riga di comando usando il parser JRE predefinito, che normalmente è Xerces. Questo può essere usato su Windows / Mac / Linux.

C'è anche una versione C ++ di Xerces disponibile se preferisci usarla. L' utilità StdInParse può essere utilizzata per chiamarla dalla riga di comando. Inoltre, un commentatore di seguito indica questa utility di wrapper più completa .

Puoi anche usare xmllint, che fa parte di libxml . Potresti già averlo installato. Esempio di utilizzo:

xmllint --noout --schema XSD_FILE XML_FILE

Un problema è che libxml non implementa tutte le specifiche, quindi potresti riscontrare problemi :(

In alternativa, se sei su Windows, puoi usare msxml , ma avrai bisogno di una sorta di wrapper per chiamarlo, come quello della GUI descritto in questo articolo DDJ . Tuttavia, sembra che molte persone su Windows utilizzino un editor XML, come Notepad ++ (come descritto nella risposta di Nate ) o XML Notepad 2007 come suggerito da SteveC (ci sono anche diversi editor commerciali che non menzionerò qui).

Infine, troverai diversi programmi che, sfortunatamente, daranno risultati diversi. Ciò è in gran parte dovuto alla complessità delle specifiche XSD. Potresti voler testare il tuo schema con diversi strumenti.

AGGIORNAMENTO : l'ho ampliato in un post sul blog .


1
Ho trovato utile quanto segue: jmvanel.free.fr/xsd/README.html
Matthew Hegarty,

Un esempio di utilizzo di StdinParse (su Linux) può essere utile: StdInParse -n -s -f -v = always <XML_FILE. XML_FILE dovrebbe includere la posizione dello schema. Per me dà risultati più completi di xmllint.
Helcim,

3
C'è un modo per chiedere a un programma di usare xsi: schemaLocation invece di alimentare manualmente tutti gli XSD?
Gabor Garami,

@GaborGarami Al momento, ma è una richiesta di funzionalità: github.com/amouat/xsd-validator/issues/5
Adrian Mouat

1
xmllintsfortunatamente non è conforme alla regex XML, quindi alcune regex XML valide non passeranno attraverso di essa
Sergey Bushmanov,

112

C'è un plug-in per Notepad ++ chiamato XML Tools che offre la verifica e la validazione XML su un XSD.

Puoi vedere come usarlo qui .


5
-1, questo plugin è
difficile

2
Ho provato con npp 5.8.6, XMLTools 2.3.1 unicode beta2 r805, funziona benissimo.
Palani,

5
Ottimo plugin. Vedere Notepad ++ XmlTools Not Installation per assistenza con l'installazione.
Ladenedge,

16
E con la versione 5.8.7, il Plugin Manager ("Plugin / Plugin Manager") di Notepad ++ rende automatico il processo di installazione.
Alimentato il

1
@FranzEbner Ho avuto questo stesso problema. Se lo XMLstesso fa riferimento a un XSDfile, ad esempio xsi:noNamespaceSchemaLocation="file.xsd", XML Tools proverà ad usarlo invece di darti un dialogo "set".
theblang

22

xmlstarlet è uno strumento da riga di comando che farà questo e altro:

$ xmlstarlet val --help
XMLStarlet Toolkit: Convalida documenti XML
Utilizzo: xmlstarlet val <opzioni> [<xml-file-or-uri> ...]
dove <opzioni>
  -w o --well-shaped - convalida solo la buona formalità (impostazione predefinita)
  -d o --dtd <dtd-file> - convalida con DTD
  -s o --xsd <xsd-file> - convalida rispetto allo schema XSD
  -E o --embed - convalida mediante DTD incorporato
  -r o --relaxng <rng-file> - convalida contro lo schema Relax-NG
  -e o --err - stampa messaggi di errore dettagliati su stderr
  -b o --list-bad - elenca solo i file che non convalidano
  -g o --list-good - elenca solo i file che convalidano
  -q o --quiet - non elencare i file (restituisce solo il codice risultato)

NOTA: gli schemi XML non sono ancora completamente supportati a causa della sua incompletezza
      supporto in libxml2 (vedi http://xmlsoft.org)

XMLStarlet è un toolkit da riga di comando per interrogare / modificare / controllare / trasformare
Documenti XML (per ulteriori informazioni consultare http://xmlstar.sourceforge.net/)

L'uso nel tuo caso sarebbe sulla falsariga di:

xmlstarlet val --xsd your_schema.xsd your_file.xml

3
Sai quanto è grave l'avvertimento di non supportare completamente gli schemi XML?
Jason Dagit,

2
A giudicare dalle altre risposte xmlstarlet è un po 'debole sulla sua implementazione xsd.
Jason Dagit,

3
Dato che xmlstarlet usa solo libxml2 sotto il cofano, è probabilmente più semplice usare xmllint che è in bundle con libxml2 e spiegato nella risposta accettata.
Adrian Mouat,

@JasonDagit, ... è esattamente debole come xmllint - usano la stessa implementazione della libreria.
Charles Duffy,

Il modello di contenuto non è deterministico. :-(
Greg

16

Per Windows c'è l' XML Notepad 2007 gratuito . È possibile selezionare XSD per cui convalidare

AGGIORNAMENTO: meglio ancora, usa Notepad ++ con il plugin XML Tools



3

1
Hanno una riga di comando che può essere utilizzata da una console per verificare la convalida di un file XSLT rispetto all'XSD di XSLT 2.0?
Alexis Wilke,

Sì, è possibile installare uno strumento CLI con sudo apt install libxerces-c-samplese quindi controllare il documento con StdInParse -v=always -n -s < document.xml.
jgrocha,


2

Sto solo imparando Schema. Sto usando RELAX NG e utilizzo xmllint per convalidare. Mi sento frustrato dagli errori che provengono da xmlllint. Vorrei che fossero un po 'più informativi.

Se è presente un attributo errato nell'XML, xmllint indica il nome dell'attributo non supportato. Ma se ti manca un attributo nell'XML, ricevi semplicemente un messaggio che dice che l'elemento non può essere validato.

Sto lavorando su un XML molto complicato con regole molto complicate, e sono nuovo a questo, quindi rintracciare l'attributo mancante richiede molto tempo.

Aggiornamento: ho appena trovato uno strumento Java che mi piace molto. Può essere eseguito dalla riga di comando come xmllint e supporta RELAX NG: https://msv.dev.java.net/


2

Ho trovato questo validatore online di 'corefiling' abbastanza utile -
http://www.corefiling.com/opensource/schemaValidate.html

Dopo aver provato alcuni strumenti per convalidare il mio xsd, questo è quello che mi ha dato informazioni dettagliate sull'errore, quindi sono stato in grado di correggere l'errore nello schema.


2

Un editor XML per la convalida XML semplice e veloce è disponibile all'indirizzo http://www.xml-buddy.com

Devi solo eseguire il programma di installazione e successivamente puoi convalidare i tuoi file XML con un'applicazione desktop o la riga di comando di facile utilizzo. Inoltre ottieni supporto per Schematron e RelaxNG. È supportata anche la convalida in batch ...

Aggiornamento 13/01/2012: lo strumento da riga di comando è gratuito e utilizza Xerces come parser XML.


1

un ottimo strumento visivo per convalidare e generare XSD da XML è IntelliJ IDEA, intuitivo e semplice.


1

È possibile connettere lo schema XML a Intellisense di Microsoft Visual Studio. Questa opzione offre sia la convalida in tempo reale sia il completamento automatico, il che è semplicemente fantastico.

Ho questo esatto scenario in esecuzione sulla mia copia gratuita di Microsoft Visual C ++ 2010 Express.



0

Tendo a usare xsd di Microsoft per aiutare a generare xsd da un file .NET. Analizzo anche sezioni dell'xml usando xmlstarlet. Lo strumento gratuito finale che ti sarebbe utile è altovaxml, disponibile a questo URL: http://www.altova.com/download_components.html .

Questo mi permette di scansionare tutti i file xml rilevando quale xsd usare analizzando l'xml.

# Function:
#    verifyschemas - Will validate all xml files in a configuration directory against the schemas in the passed in directory
# Parameters:
#    The directory where the schema *.xsd files are located.  Must be using dos pathing like: VerifySchemas "c:\\XMLSchemas\\"
# Requirements:
#    Must be in the directory where the configuration files are located
#
verifyschemas()
{
    for FILENAME in $(find . -name '*.xml' -print0 | xargs -0)
    do
        local SchemaFile=$1$(getconfignamefromxml $FILENAME).xsd
        altovaxml /validate $FILENAME /schema $SchemaFile > ~/temp.txt 2> /dev/null
        if [ $? -ne 0 ]; then
            printf "Failed to verify: "
            cat ~/temp.txt | tail -1 | tr -d '\r'
            printf "    - $FILENAME with $SchemaFile\n"
        fi
    done
}

Per generare l'xml che uso: xsd DOTNET.dll / tipo: CFGCLASS e rinomina schema0.xsd CFGCLASS.xsd

Per ottenere il nome xsd che uso: xmlstarlet sel -t -m / XXX / * -v local-name () $ 1 | sed 's / $ //'

Questo mi permette di prelevare l'XSD corretto usando un tag element all'interno del file xml.

Il risultato netto è che posso chiamare una funzione bash per scansionare tutti i file XML e verificarli. Anche se si trovano in più sottodirectory.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.