سؤال

أحاول استخدام XML يشمل للمساعدة في إدارة كبيرة XML الهيكل الذي يجب أن تكون قابلة للاستخدام من قبل كل البشر والآلات.

لكن هل تعاني من العديد من المشاكل عند محاولة إنشاء ملفات XML التي يمكن التحقق من صحتها ضد موجود المخطط.وهنا مثال مبسط ما أحاول القيام به.

بلدي "main.xml" الملف لا تتحقق.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Main.xml - This fails to validate. -->
<ns1:main xsi:schemaLocation="http://www.example.com/main main.xsd"
          xmlns:ns1="http://www.example.com/main"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xi="http://www.w3.org/2001/XInclude">

    <name>String</name>
    <xi:include href="child.xml"/> <!-- What I'm trying to do. -->

</ns1:main>

إن "child.xml" ملف بالتحقق بخير كملف مستقل.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Child.xml - This validates fine, as a standalone file. -->
<ns1:child xsi:schemaLocation="http://www.example.com/main main.xsd"
           xmlns:ns1="http://www.example.com/main"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <name>String</name>
    <age>String</age>

 </ns1:child>

هنا هو بلدي المخطط:

 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Main.xsd - My Simplified Schema -->
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:ns1="http://www.example.com/main"
            targetNamespace="http://www.example.com/main">

    <!-- Main Element (References Child) -->
    <xs:element name="main">
         <xs:complexType>
             <xs:sequence>
                 <xs:element name="name" type="xs:string"/>
                 <xs:element ref="ns1:child"/>
             </xs:sequence>
         </xs:complexType>
    </xs:element>

    <!-- Child Element -->
    <xs:element name="child">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="age" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
     </xs:element>

</xs:schema>

مشاكلي هي تقريبا-من الواضح ذات مساحات ولكن أنا في حيرة عن كيفية حل مشكلتي.

هل كانت مفيدة؟

المحلول

كما سكافي تمت الإشارة بالفعل إلى مخطط XML و Xinclude غير متوافق.

رسالة خطأ التحقق من الصحة من xmllint. تنص على هذا بوضوح:

main.xml:9: element include: Schemas validity error : Element  '{http://www.w3.org/2001/XInclude}include': This element is not expected. Expected is ( {http://www.example.com/main}child ).
main.xml fails to validate

إلى اقتباس توصية W3C.: .

وبالتالي يجب عليك أولا إنشاء ملف XML بأكمله من خلال تطبيق Xincludes، والتحقق من صحة هذا الملف بعد ذلك.

تحرير: يمكنك استخدام xmllint. مع --xinclude للتحقق من صحة main.xml.

نصائح أخرى

أنا أتفق مع grantwparks - XInclude و مخطط XML تماما يمكن أن تستخدم جنبا إلى جنب.المواصفات عمدا مستقلة عن بعضها البعض.يبدو أن واضعي XInclude أراد أن توفر حرية السماح يشمل معالجتها قبل التحقق من الصحة أو بعد التحقق من صحة.

هذا موضوع على velocityreviews يناقش المسألة و الجواب الذي ساعدني على فهم المسألة هذا المنصب على xml.com, نقلا من:

واحد من الأسئلة الأكثر شيوعا حول XInclude هو كيفية إدراج يتفاعل مع التحقق من صحة, تحويل XSL وغيرها من العمليات التي يمكن تطبيقها على مستند XML.الجواب القصير هو أنه لا.XInclusion ليست جزءا من أي XML العملية.وهو خطوة منفصلة والتي قد أو قد لا تؤدي فيه مفيدة لك.

على سبيل المثال النظر في المصادقة ضد المخطط.يمكن أن تكون الوثيقة التحقق من صحة قبل إدراج ، بعد إدراج أو كليهما.إذا كنت من صحة الوثيقة قبل الحادي عشر:تشمل العناصر يتم استبدال ، ثم المخطط له أن يعلن الحادي عشر:تشمل عناصر مثل ذلك من شأنه أن يعلن أي عنصر آخر.إذا كنت من صحة الوثيقة بعد الحادي عشر:تشمل العناصر محل ، ثم المخطط أن يعلن استبدال العناصر.إدراج و التحقق من صحة منفصلة ، متعامد العمليات التي يمكن القيام بها في أي أمر وهو مريحة في البيئة المحلية

حتى ما يبدو أن تختزل إلى الحصول على الخاص بك XML أدوات عملية الحادي عشر:تشمل العناصر قبل التحقق من صحة (هذا هو ما على سبيل المثال المرجع الاحتياجات).على سبيل المثال ، في محرر XML من الكسوف ، هناك وضع "عملية XML شوائب" تحت XML -> ملفات XML -> التحقق من صحة (باستخدام RSA 8.5), التي تحتاج إلى أن تتحول إلى الحصول على محرر عملية الحادي عشر:وتشمل قبل التحقق من الصحة.

اندي

لا أعتقد أن مخطط XML ومواصفات Xinclude مضمونة لتكون متوافقة مع بعضها البعض. قد تسمح لمعالجات XML الفردية بذلك، لكن الآخرين لن يفعلوا ذلك.

كقاعدة عامة، أقول إن الاثنين لا ينبغي استخدامه معا.

ملاحظة: لست متأكدا لماذا تعتقد أن هذه مشكلة مساحة الاسم. ما الذي يمنحك هذا الانطباع؟

لا أعتقد أن هذا ناتج عن عدم التوافق بين Xinclude ومخطط؛ يبدو لي مثل ما لا يتم معالجته قبل التحقق من الصحة. وبالتالي فإن المخطط لا يسمح بعنصر "تشمل" في الرئيسية، فقط عنصر "الطفل". إذا تمكنت من إجبار معالج XML الخاص بك على معالجة يتضمن قبل التحقق من الصحة ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top