xmllint: दो XSD स्कीमा(लिफ़ाफ़ा/पेलोड) के विरुद्ध एक XML फ़ाइल को मान्य करें




(2)

मैं xmllint पर छोड़ दिया और इसके बजाय Xerces इस्तेमाल किया

मैंने एक्सर्स टारबाल को डाउनलोड किया और इसे कुछ स्थानीय फ़ोल्डर में विस्फोट करने के बाद मैंने निम्न मान्य स्क्रिप्ट बनाई ( इस सुझाव के आधार पर):

#!/bin/bash
XERCES_HOME=~/software-downloads/xerces-2_11_0/
echo $XERCES_HOME
java -classpath $XERCES_HOME/xercesImpl.jar:$XERCES_HOME/xml-apis.jar:$XERCES_HOME/xercesSamples.jar sax.Counter $*

अब ab.xml फ़ाइल, निम्न कमांड के साथ दोनों स्कीमा के विरुद्ध मान्य है:

 validate -v -n -np -s -f ab.xml

Xerces स्कीमा स्थानों को xsi: schemaLocation तत्व से ab.xml में पढ़ रहा है ताकि उन्हें कमांड लाइन इनवॉन्स में प्रदान करने की आवश्यकता न हो।

मैं कुछ मान्यताओं को करने के लिए xmllint का उपयोग कर रहा हूं और मेरे पास एक्सएमएल इंस्टेंस दस्तावेज है, जिसे दो स्कीमा के विरुद्ध मान्य होना चाहिए: एक बाहरी "लिफ़ाफ़ा" (जिसमें कोई भी तत्व शामिल है) के लिए और एक विशेष पेलोड के लिए एएक्सएसडी कहें लिफाफा स्कीमा, बीएक्सएसडी एक पेलोड स्कीमा (अलग-अलग संभावित पेलोड हैं) और एपी.एम.एम.एल एक वैध एक्सएमएल उदाहरण दस्तावेज़ (मैं पोस्ट के अंत में एक उदाहरण देता हूं)।

मेरे पास एक ही निर्देशिका में स्थानीय रूप से उपलब्ध सभी तीन फाइलें हैं और एक्सएमएलआईंट का प्रयोग सत्यापन करने के लिए किया जा रहा है, स्कीमा तर्क बाहरी (लिफ़ाफ़ा) स्कीमा का स्थान के रूप में प्रदान करना है:

xmllint -schema A.xsd ab.xml

... फिर भी, हालांकि मैं उदाहरण के दस्तावेज में (एक्सएसआई: स्कीमा लॉकिंग एलिमेंट) एक्सएमडीआईडी ​​और एक्सएक्सडी दोनों के स्थान को प्रदान करता है xmllint इसे खोजने में विफल रहता है और शिकायत करता है:

ab.xml:8: element person: Schemas validity error : Element '{http://www.example.org/B}person': No matching global element declaration available, but demanded by the strict wildcard.
ab.xml fails to validate

तो जाहिरा तौर पर xmllint xsi: schemaLocation तत्व नहीं पढ़ रहा है मैं समझता हूं कि xmllint को कैटलॉग के साथ कॉन्फ़िगर किया जा सकता है लेकिन मैं एक्सएमलींट को दोनों स्कीमा खोजने में विफल रहा उदाहरण के दस्तावेज को मान्य करते समय एक्सएमलींट को दोनों स्कीमाओं को ध्यान में रखने के लिए मुझे कैसे प्राप्त करना चाहिए या वहां एक अन्य कमांड लाइन उपयोगिता या ग्राफ़िकल टूल है जिसे मैं इसके बजाय इस्तेमाल कर सकता हूं?

SSCCE

एएक्सएसडी - लिफाफा स्कीमा

<?xml version="1.0" encoding="UTF-8"?>
<schema elementFormDefault="qualified" 
        xmlns               ="http://www.w3.org/2001/XMLSchema"
        xmlns:a             ="http://www.example.org/A"
        targetNamespace ="http://www.example.org/A">

       <element name="someType" type="a:SomeType"></element>

        <complexType name="SomeType">
            <sequence>
                <any namespace="##other" processContents="strict"/>
            </sequence>
        </complexType>
</schema>

बीएक्सएसडी - पेलोड स्कीमा

<?xml version="1.0" encoding="UTF-8"?>
<schema elementFormDefault="qualified"
    xmlns          ="http://www.w3.org/2001/XMLSchema"
    xmlns:b        ="http://www.example.org/B"
    targetNamespace="http://www.example.org/B"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <element name="person" type="b:PersonType"></element>
    <complexType name="PersonType">
        <sequence>
                <element name="firstName" type="string"/>
                <element name="lastName"  type="string"/>
        </sequence>
    </complexType>
  </schema>

ab.xml - उदाहरण दस्तावेज़

<?xml version="1.0" encoding="UTF-8"?>
<a:someType xmlns:a="http://www.example.org/A"
        xmlns:b="http://www.example.org/B"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.example.org/A A.xsd
                            http://www.example.org/B B.xsd">

            <b:person>
                <b:firstName>Mary</b:firstName>
                <b:lastName>Bones</b:lastName>
            </b:person>

</a:someType>

यदि आपके A.xsd में एक import तत्व था, तो schema टैग खोलने के ठीक बाद,

<xsd:import namespace="http://www.example.org/B" schemaLocation="B.xsd"/>

तो आप A.xsd को A.xsd पास कर सकते हैं और इसके साथ काम करेंगे:

xmllint -schema A.xsd ab.xml




xmllint