Narzędzie do sprawdzania poprawności schematu XML (XSD)? [Zamknięte]


266

W biurze piszemy obecnie aplikację, która wygeneruje pliki XML na podstawie podanego nam schematu. Mamy schemat w pliku .XSD.

Czy istnieją narzędzia lub biblioteki, których możemy użyć do zautomatyzowanego testowania, aby sprawdzić, czy wygenerowany XML pasuje do schematu?

Wolelibyśmy bezpłatne narzędzia, które są odpowiednie do użytku komercyjnego, chociaż nie będziemy wiązać kontrolera schematów, więc programista musi z niego korzystać tylko podczas programowania.

Nasz język programowania to C ++, jeśli robi to jakąkolwiek różnicę, chociaż nie sądzę, że powinien, ponieważ moglibyśmy wygenerować plik xml, a następnie przeprowadzić weryfikację, wywołując osobny program w teście.


132
Uwielbiam, ile z tych „mało konstruktywnych” pytań jest najczęściej wyszukiwanych przez Google wyników wyszukiwania, a odpowiedzi są przydatne
Matt Freake

1
Rozumiem, skąd się bierze, z konstruktywnym. Szczerze mówiąc, chociaż jest to świetne pytanie, a debata / argumenty czasami kończą się uzyskiwaniem wspaniałych odpowiedzi
Matt

22
jest to dokładny przypadek, w którym administratorzy są nieproduktywni
anon58192932

Być może warto spojrzeć na podobne pytanie w kontekście narzędzia do budowania Maven .
Alberto,

Odpowiedzi:


239

Po kilku badaniach uważam, że najlepszą odpowiedzią jest Xerces , ponieważ implementuje on całą XSD, jest wieloplatformowy i szeroko stosowany. Utworzyłem mały projekt Java na github, aby sprawdzić poprawność z wiersza poleceń przy użyciu domyślnego parsera JRE, którym zwykle jest Xerces. Można tego użyć w systemie Windows / Mac / Linux.

Dostępna jest również wersja Xerces języka C ++, jeśli wolisz z niej korzystać. Do wywołania go z wiersza poleceń można użyć narzędzia StdInParse . Ponadto komentator poniżej wskazuje na to bardziej kompletne narzędzie do pakowania .

Możesz także użyć xmllint, który jest częścią libxml . Być może już go masz. Przykładowe użycie:

xmllint --noout --schema XSD_FILE XML_FILE

Jednym z problemów jest to, że libxml nie implementuje całej specyfikacji, więc możesz napotkać problemy :(

Alternatywnie, jeśli korzystasz z systemu Windows, możesz użyć msxml , ale będziesz potrzebować jakiegoś opakowania, aby go wywołać, takiego jak GUI opisany w tym artykule DDJ . Wydaje się jednak, że większość osób korzystających z systemu Windows korzysta z edytora XML, takiego jak Notepad ++ (jak opisano w odpowiedzi Nate'a ) lub XML Notepad 2007, jak sugeruje SteveC (jest też kilka komercyjnych edytorów, o których tutaj nie wspomnę).

Wreszcie, różne programy dadzą niestety różne wyniki. Wynika to głównie ze złożoności specyfikacji XSD. Możesz przetestować swój schemat za pomocą kilku narzędzi.

AKTUALIZACJA : rozwinąłem to w poście na blogu .


1
Znalazłem następujące pomocne: jmvanel.free.fr/xsd/README.html
Matthew Hegarty

Przydatne może być użycie użycia StdinParse (w systemie Linux): StdInParse -n -s -f -v = zawsze <PLIK_ XML. PLIK_ XML powinien zawierać lokalizację schematu. Dla mnie daje to bardziej kompletne wyniki niż xmllint.
helcim

3
Czy istnieje sposób, aby poprosić program o użycie xsi: schemaLocation zamiast ręcznego podawania wszystkich XSD?
Gabor Garami

@GaborGarami W tej chwili nie, ale jest to prośba o nową funkcję: github.com/amouat/xsd-validator/issues/5
Adrian Mouat

1
xmllintnie jest zgodny z wyrażeniami regularnymi XML, niestety, więc niektóre poprawne wyrażenia XML nie przejdą przez to
Sergey Bushmanov

112

Istnieje wtyczka dla Notepad ++ o nazwie XML Tools, która oferuje weryfikację XML i sprawdzanie poprawności względem XSD.

Można zobaczyć, jak go używać tutaj .


5
-1, instalacja tej wtyczki jest uciążliwa
jcollum

2
Testowałem z npp 5.8.6, XMLTools 2.3.1 Unicode beta2 r805, działa dobrze.
Palani

5
Świetna wtyczka. Aby uzyskać pomoc dotyczącą instalacji, zobacz Notepad ++ XmlTools Not Installing .
ladgedge

16
W wersji 5.8.7 własny menedżer wtyczek Notepad ++ („Plugins / Plugin Manager”) sprawia, że ​​proces instalacji przebiega automatycznie.
Zatankowane

1
@FranzEbner Miałem ten sam problem. Jeśli na przykład XMLodwołuje się do XSDpliku, xsi:noNamespaceSchemaLocation="file.xsd"to XML Tools spróbuje go użyć zamiast dać ci „zestaw” dialogu.
theblang

22

xmlstarlet to narzędzie wiersza polecenia, które zrobi to i wiele więcej:

$ xmlstarlet val --help
XMLStarlet Toolkit: Sprawdź poprawność dokumentów XML
Zastosowanie: xmlstarlet val <opcje> [<xml-file-or-uri> ...]
gdzie <opcje>
  -w lub --well-shaped - sprawdź tylko poprawność (domyślnie)
  -d lub --dtd <plik -dtd-> - sprawdź poprawność względem DTD
  -s lub --xsd <plik xxd> - sprawdź poprawność względem schematu XSD
  -E lub --embed - sprawdź poprawność za pomocą wbudowanego DTD
  -r lub --relaxng <rng-file> - sprawdź poprawność względem schematu Relax-NG
  -e lub --err - wypisuje pełne komunikaty o błędach na stderr
  -b lub --list-bad - wyświetla tylko pliki, które nie są sprawdzane
  -g lub --list-good - wyświetla tylko te pliki, które sprawdzają poprawność
  -q lub --quiet - nie wyświetlaj plików (zwracaj tylko kod wyniku)

UWAGA: Schematy XML nie są jeszcze w pełni obsługiwane ze względu na ich niekompletność
      wsparcie w libxml2 (patrz http://xmlsoft.org)

XMLStarlet to zestaw narzędzi wiersza poleceń do zapytań / edycji / sprawdzenia / transformacji
Dokumenty XML (więcej informacji na stronie http://xmlstar.sourceforge.net/)

W twoim przypadku użycie byłoby zgodne z następującymi zasadami:

xmlstarlet val --xsd your_schema.xsd your_file.xml

3
Czy wiesz, jak poważne jest to ostrzeżenie o nieobsługiwaniu w pełni schematów XML?
Jason Dagit

2
Sądząc po innych odpowiedziach, xmlstarlet jest nieco słaby w swojej implementacji xsd.
Jason Dagit

3
Biorąc pod uwagę, że xmlstarlet używa po prostu libxml2 pod maską, prawdopodobnie łatwiej jest po prostu użyć xmllint, który jest dołączony do libxml2 i wyjaśniony w zaakceptowanej odpowiedzi.
Adrian Mouat,

@JasonDagit, ... jest dokładnie tak słaby jak xmllint - używają tej samej implementacji biblioteki.
Charles Duffy,

Model treści nie jest deterministyczny. :-(
Greg

16

W systemie Windows dostępny jest bezpłatny Notatnik XML 2007 . Możesz wybrać XSD, dla których ma się sprawdzić

AKTUALIZACJA: jeszcze lepiej, użyj Notepad ++ z wtyczką XML Tools



3

1
Czy mają wiersz poleceń, którego można używać z konsoli do sprawdzania poprawności pliku XSLT względem XSD XSLT 2.0?
Alexis Wilke

Tak, możesz zainstalować narzędzie CLI za pomocą, sudo apt install libxerces-c-samplesa następnie sprawdzić dokument za pomocą StdInParse -v=always -n -s < document.xml.
jgrocha


2

Właśnie uczę się schematu. Używam RELAX NG i sprawdzam poprawność za pomocą xmllint. Czuję się sfrustrowany błędami wychodzącymi z Xmlllint. Chciałbym, żeby były trochę bardziej pouczające.

Jeśli w pliku XML jest niewłaściwy atrybut, xmllint poda nazwę nieobsługiwanego atrybutu. Ale jeśli brakuje Ci atrybutu w pliku XML, po prostu pojawia się komunikat informujący, że elementu nie można sprawdzić.

Pracuję nad bardzo skomplikowanym XML-em z bardzo skomplikowanymi regułami i jestem nowy w tym, więc śledzenie, którego atrybutu brakuje, zajmuje dużo czasu.

Aktualizacja: Właśnie znalazłem narzędzie Java, które bardzo mi się podoba. Można go uruchomić z wiersza polecenia, takiego jak xmllint, i obsługuje RELAX NG: https://msv.dev.java.net/



2

Edytor XML do szybkiego i łatwego sprawdzania poprawności XML jest dostępny na stronie http://www.xml-buddy.com

Wystarczy uruchomić instalator, a następnie sprawdzić poprawność plików XML za pomocą łatwej w obsłudze aplikacji komputerowej lub wiersza polecenia. Ponadto otrzymujesz wsparcie dla Schematron i RelaxNG. Obsługiwane jest również sprawdzanie poprawności partii ...

Aktualizacja 1/13/2012: Narzędzie wiersza polecenia jest bezpłatne i używa Xerces jako parsera XML.


1

jednym doskonałym narzędziem wizualnym do sprawdzania poprawności i generowania XSD z XML jest IntelliJ IDEA, intuicyjny i prosty.


1

Możesz połączyć swój schemat XML z Intellisense Microsoft Visual Studio. Ta opcja zapewnia zarówno weryfikację w czasie rzeczywistym ORAZ autouzupełnianie, co jest po prostu niesamowite.

Mam dokładnie ten scenariusz na mojej bezpłatnej kopii programu Microsoft Visual C ++ 2010 Express.



0

Zwykle używam xsd od Microsoft, aby pomóc wygenerować xsd z pliku .NET. Analizuję również sekcje xml za pomocą xmlstarlet. Ostatnim bezpłatnym narzędziem, które byłoby dla Ciebie przydatne, jest altovaxml, który jest dostępny pod tym adresem URL: http://www.altova.com/download_components.html .

To pozwala mi skanować wszystkie pliki xml, wybierając, którego xsd użyć, parsując 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
}

Aby wygenerować xml używam: xsd DOTNET.dll / type: CFGCLASS i zmień nazwę schema0.xsd CFGCLASS.xsd

Aby uzyskać nazwę xsd, używam: xmlstarlet sel -t -m / XXX / * -v nazwa-lokalna () $ 1 | sed 's / $ //'

To pozwala mi pobrać poprawną XSD za pomocą znacznika elementu w pliku xml.

W rezultacie mogę wywołać funkcję bash, aby zeskanować wszystkie pliki XML i je zweryfikować. Nawet jeśli znajdują się w wielu podkatalogach.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.