XML Şeması (XSD) doğrulama aracı? [kapalı]


266

Ofiste şu anda bize verilen bir şemaya karşı XML dosyaları oluşturacak bir uygulama yazıyoruz. Şemayı bir .XSD dosyasında aldık.

Oluşturulan XML'in şema ile eşleşip eşleşmediğini kontrol etmek için otomatik test için kullanabileceğimiz araç veya kütüphaneler var mı?

Şema denetleyicisini bir araya getirmeyeceğimiz için ticari kullanıma uygun ücretsiz araçları tercih ederiz, bu nedenle geliştirme sırasında yalnızca geliştiriciler tarafından kullanılabilir olması gerekir.

Geliştirme dilimiz C ++, eğer herhangi bir fark yaratırsa da, xml dosyasını üretebileceğimiz ve daha sonra testte ayrı bir program çağırarak doğrulama yapacağımızı düşünmüyorum.


132
Bu "yapıcı olmayan" sorulardan kaç tanesinin aradığım şeylerin en iyi Google arama sonuçları olduğunu ve yanıtların yararlı olduğunu
seviyorum

1
Yapıcı olmayanla nereden geldiğini anlıyorum. Dürüst olmak gerekirse, bu harika bir soru ve tartışma / argümanlar bazen harika cevaplara dönüşüyor
Matt

22
Bu, yöneticilerin karşı üretken olduğu tam durumdur
anon58192932

Maven oluşturma aracı bağlamında benzer bir soruya bakmaya değer olabilir .
Alberto

Yanıtlar:


239

Bazı araştırmalardan sonra, en iyi cevabın Xerces olduğunu düşünüyorum , çünkü tüm XSD'yi uygular, platformlar arası ve yaygın olarak kullanılır. Normal Xerces olan varsayılan JRE ayrıştırıcısını kullanarak komut satırından doğrulamak için github üzerinde küçük bir Java projesi oluşturdum . Bu, Windows / Mac / Linux'ta kullanılabilir.

Bir de bulunmaktadır Xerces C ++ sürüm Bunun yerine o kullanmayı tercih ederseniz kullanılabilir. StdInParse yarar komut satırından çağırmak için kullanılabilir. Ayrıca, aşağıdaki yorum yapan kişi bu daha eksiksiz sarmalayıcı yardımcı programına işaret etmektedir .

Ayrıca bir parçası olan xmllint komutunu, kullanabilirsiniz libxml . Yüklemiş olabilirsiniz. Örnek kullanım:

xmllint --noout --schema XSD_FILE XML_FILE

Bir sorun, libxml'in tüm spesifikasyonu uygulamadığı için sorunla karşılaşabilirsiniz :(

Alternatif olarak, Windows kullanıyorsanız, msxml kullanabilirsiniz , ancak bu DDJ makalesinde açıklanan GUI olanı gibi çağırmak için bir tür sarıcıya ihtiyacınız olacaktır . Ancak, Windows'taki çoğu insan, SteveC tarafından önerilen Notepad ++ ( Nate'in cevabında açıklandığı gibi ) veya XML Notepad 2007 gibi bir XML Düzenleyicisi kullanıyor gibi görünüyor ( burada bahsetmeyeceğim birkaç ticari editör de var).

Son olarak, farklı programların maalesef farklı sonuçlar vereceğini göreceksiniz. Bu büyük ölçüde XSD spesifikasyonunun karmaşıklığından kaynaklanmaktadır. Şemanızı çeşitli araçlarla test etmek isteyebilirsiniz.

GÜNCELLEME : Bunu bir blog gönderisinde genişlettim .


1
Aşağıdakileri faydalı buldum: jmvanel.free.fr/xsd/README.html
Matthew Hegarty

Bir örnek StdinParse kullanımı (linux üzerinde) faydalı olabilir: StdInParse -n -s -f -v = her zaman <XML_FILE. XML_FILE, şema konumunu içermelidir. Benim için xmllint'ten daha eksiksiz sonuçlar veriyor.
helcim

3
Bir programdan tüm XSD'leri manuel olarak beslemek yerine xsi: schemaLocation uygulamasını kullanmasını istemenin bir yolu var mı?
Gabor Garami

@GaborGarami Şu anda değil, ancak bir özellik isteği: github.com/amouat/xsd-validator/issues/5
Adrian Mouat

1
xmllintXML regex uyumlu değil, ne yazık ki, bu yüzden bazı geçerli XML regexes geçemez
Sergey Bushmanov

112

Notepad ++ için XML Araçları olarak adlandırılan ve XSD'ye karşı XML doğrulaması ve doğrulaması sunan bir eklenti vardır .

Burada nasıl kullanılacağını görebilirsiniz .


5
-1, bu eklenti yüklemek için bir acı
jcollum

2
Npp 5.8.6, XMLTools 2.3.1 unicode beta2 r805 ile test ettim, iyi çalışıyor.
Palani

5
Harika bir eklenti. Kurulumla ilgili yardım için Notepad ++ XmlTools Yüklenmiyor bölümüne bakın .
ladenedge

16
Ve sürüm 5.8.7 ile, Notepad ++ 'ın kendi Eklenti Yöneticisi ("Eklentiler / Eklenti Yöneticisi") yükleme işlemini otomatik hale getirir.
Yakıtlandırıldı

1
@FranzEbner Aynı sorunu yaşadım. Örneğin, XMLkendisi bir XSDdosyaya başvuruyorsa xsi:noNamespaceSchemaLocation="file.xsd", XML Araçları size bir "set" iletişim kutusu vermek yerine onu kullanmaya çalışır.
theblang

22

xmlstarlet bunu ve daha fazlasını yapacak bir komut satırı aracıdır:

$ xmlstarlet val --help
XMLStarlet Araç Kiti: XML belgelerini doğrula
Kullanım: xmlstarlet val <seçenekler> [<xml-file-or-uri> ...]
burada <seçenekler>
  -w veya - iyi biçimlendirilmiş - yalnızca iyi biçimlendirmeyi doğrulayın (varsayılan)
  -d veya --dtd <dtd-file> - DTD'ye karşı doğrulama
  -s veya --xsd <xsd-file> - XSD şemasına göre doğrulama
  -E veya --embed - gömülü DTD kullanarak doğrulama
  -r veya --relaxng <rng-file> - Relax-NG şemasına karşı doğrulama
  -e veya --err - stderr'de ayrıntılı hata mesajlarını yazdır
  -b veya --list-bad - yalnızca doğrulamayan dosyaları listele
  -g veya --list-good - yalnızca doğrulayan dosyaları listele
  -q veya --quiet - dosyaları listeleme (yalnızca sonuç kodunu döndür)

NOT: XML Şemaları, eksik olması nedeniyle henüz tam olarak desteklenmemektedir
      libxml2'de destek (bkz. http://xmlsoft.org)

XMLStarlet sorgulamak / düzenlemek / kontrol etmek / dönüştürmek için bir komut satırı araç takımıdır
XML belgeleri (daha fazla bilgi için bkz. Http://xmlstar.sourceforge.net/)

Sizin durumunuzda kullanım çizgileri boyunca olacaktır:

xmlstarlet val --xsd your_schema.xsd your_file.xml

3
Xml şemalarını tam olarak desteklememenin ne kadar ciddi olduğunu biliyor musunuz?
Jason Dagit

2
Diğer cevaplara bakılırsa xmlstarlet xsd uygulamasında biraz zayıftır.
Jason Dagit

3
Xmlstarlet sadece başlık altında libxml2 kullandığından, libxml2 ile birlikte gelen ve kabul edilen cevapta açıklanan xmllint'i kullanmak daha kolaydır.
Adrian Mouat

@JasonDagit, ... xmllint kadar zayıf - aynı kütüphane uygulamasını kullanıyorlar.
Charles Duffy

İçerik modeli determinist değildir. :-(
Greg

16

Windows için ücretsiz XML Notepad 2007 var . Karşılık doğrulaması için XSD'leri seçebilirsiniz

GÜNCELLEME: daha da iyisi, XML Tools eklentisi ile Notepad ++ kullanın



3

Xerces kullanıyorum:

http://xerces.apache.org/xerces-c/


1
XSLT dosyasının XSLT 2.0 karşı XSDT doğrulamasını kontrol etmek için konsoldan kullanılabilecek bir komut satırı var mı?
Alexis Wilke

Evet, ile bir CLI aracı yükleyebilir sudo apt install libxerces-c-samplesve ardından ile belgeyi kontrol edebilirsiniz StdInParse -v=always -n -s < document.xml.
jgrocha


2

Sadece Şema öğreniyorum. RELAX NG kullanıyorum ve onaylamak için xmllint kullanıyorum. Ben xmlllint çıkan hatalar ile sinirli alıyorum. Keşke biraz daha bilgilendirici olsaydı.

XML'de yanlış bir özellik varsa, xmllint size desteklenmeyen özelliğin adını söyler. Ancak XML'de bir özellik eksikse, öğenin doğrulanamayacağını söyleyen bir mesaj alırsınız.

Çok karmaşık kurallara sahip çok karmaşık bir XML üzerinde çalışıyorum ve bu konuda yeniyim, bu yüzden hangi özelliğin eksik olduğunu izlemek uzun zaman alıyor.

Güncelleme: Çok sevdiğim bir java aracı buldum. Komut satırından xmllint gibi çalıştırılabilir ve RELAX NG'yi destekler: https://msv.dev.java.net/



2

Hızlı ve kolay XML doğrulaması için bir XML düzenleyicisi http://www.xml-buddy.com adresinde mevcuttur.

Yükleyiciyi çalıştırmanız yeterlidir ve bundan sonra XML dosyalarınızı kullanımı kolay bir masaüstü uygulaması veya komut satırı ile doğrulayabilirsiniz. Ayrıca Schematron ve RelaxNG için de destek alabilirsiniz. Toplu doğrulama da desteklenmektedir ...

Güncelleme 1/13/2012: Komut satırı aracı ücretsizdir ve Xerces'i XML ayrıştırıcısı olarak kullanır.


1

XML'den XSD'yi doğrulamak ve oluşturmak için harika bir görsel araç, IntelliJ IDEA, sezgisel ve basittir.


1

XML şemanızı Microsoft Visual Studio'nun Intellisense yazılımına bağlayabilirsiniz. Bu seçenek size hem gerçek zamanlı doğrulama hem de otomatik tamamlama sağlar.

Microsoft Visual C ++ 2010 Express'in ücretsiz kopyasında çalışan bu senaryo var.



0

.NET dosyasından xsd oluşturmak için Microsoft'tan xsd kullanma eğilimindedir. Ayrıca xmlstarlet kullanarak xml bölümlerini ayrıştırmak. Kullanabileceğiniz son ücretsiz araç, şu URL'de bulunan altovaxml'dir: http://www.altova.com/download_components.html .

Bu bana xml ayrıştırarak hangi xsd kullanılacak toplama tüm xml dosyalarını taramak için izin verir.

# 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
}

Kullanmak xml oluşturmak için: xsd DOTNET.dll / türü: CFGCLASS & schema0.xsd yeniden adlandırın CFGCLASS.xsd

Kullandığım xsd adını almak için: xmlstarlet sel -t -m / XXX / * -v local-name () $ 1 | sed 's / $ //'

Bu, xml dosyasındaki bir öğe etiketini kullanarak doğru XSD'yi almamı sağlar.

Net sonuç, tüm XML dosyalarını taramak ve doğrulamak için bir bash işlevini çağırabilirim. Birden çok alt dizinde olsalar bile.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.