سؤال

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

#!/usr/bin/env perl
use strict;
use warnings;
use XML::LibXML;

my $filename = 'source.xml';
my $xml_schema = XML::LibXML::Schema->new(location=>'library.xsd');
my $parser = XML::LibXML->new ();
my $doc = $parser->parse_file ($filename);

eval {
    $xml_schema->validate ($doc);
};

if ($@) {
    print "File failed validation: $@" if $@;
}

eval {
    print "Here\n";
    foreach my $book ($doc->findnodes('/library/book')) {
        my $title = $book->findnodes('./title');
        print $title->to_literal(), "\n";

    }
};

if ($@) {
    print "Problem parsing data : $@\n";
}

ومما يؤسف له، على الرغم من أنه التحقق من صحة غرامة ملف XML، فإنه لا تجد أي من البنود كتاب $، وبالتالي لا تطبع أي شيء.

إذا كنت إزالة المخطط من ملف XML والتحقق من ملف PL ثم فإنه يعمل بشكل جيد.

وأنا باستخدام مساحة الاسم الافتراضية. إذا قمت بتغيير ذلك حتى لا يتم استخدام مساحة الاسم الافتراضي (XMLNS: ليب = "http://libs.domain.com" وبادئة كافة العناصر الموجودة في ملف XML مع ليب وتغيير تعابير XPath لتشمل بادئة مساحة (/ ليب: مكتبة / ليب: كتاب) ثم يعمل الملف مرة أخرى

لماذا؟ وما أنا في عداد المفقودين؟

وXML:

<?xml version="1.0" encoding="utf-8"?>
<library xmlns="http://lib.domain.com" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://lib.domain.com .\library.xsd">
    <book>
        <title>Perl Best Practices</title>
        <author>Damian Conway</author>
        <isbn>0596001738</isbn>
        <pages>542</pages>
        <image src="http://www.oreilly.com/catalog/covers/perlbp.s.gif" width="145" height="190"/>
    </book>
    <book>
        <title>Perl Cookbook, Second Edition</title>
        <author>Tom Christiansen</author>
        <author>Nathan Torkington</author>
        <isbn>0596003137</isbn>
        <pages>964</pages>
        <image src="http://www.oreilly.com/catalog/covers/perlckbk2.s.gif" width="145" height="190"/>
    </book>
    <book>
        <title>Guitar for Dummies</title>
        <author>Mark Phillips</author>
        <author>John Chappell</author>
        <isbn>076455106X</isbn>
        <pages>392</pages>
        <image src="http://media.wiley.com/product_data/coverImage/6X/07645510/076455106X.jpg" width="100" height="125"/>
    </book>
</library>

وXSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="http://lib.domain.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://lib.domain.com">
    <xs:attributeGroup name="imagegroup">
        <xs:attribute name="src" type="xs:string"/>
        <xs:attribute name="width" type="xs:integer"/>
        <xs:attribute name="height" type="xs:integer"/>
    </xs:attributeGroup>
    <xs:element name="library">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="book">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="title" type="xs:string"/>
                            <xs:element maxOccurs="unbounded" name="author" type="xs:string"/>
                            <xs:element name="isbn" type="xs:string"/>
                            <xs:element name="pages" type="xs:integer"/>
                            <xs:element name="image">
                                <xs:complexType>
                                    <xs:attributeGroup ref="imagegroup"/>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
هل كانت مفيدة؟

المحلول

XML :: LibXML مستندات :

<اقتباس فقرة>   

وهناك خطأ شائع حول كسباث هو   نفترض أن الاختبارات العقدة التي تتكون من   اسم عنصر مع أي تطابق البادئة   العناصر في مساحة الاسم الافتراضي.   هذا الافتراض خاطئ - من كسباث   مواصفات، مثل هذه الاختبارات العقدة يمكن   تطابق العناصر التي هي في فقط لا   (أي لاغية) مساحة الاسم. ... (و   في وقت لاحق) ... الطريقة الموصى بها هي ل   استخدام XML :: :: LibXML XPathContext   وحدة

وهكذا، من وجهة نظر كسباث، ليس هناك مساحة "الافتراضي" ... أية مساحة غير الصفرية، لديك لتحديد ذلك في كسباث الخاص بك. وحدة XML :: :: LibXML XPathContext يتيح لك إنشاء بادئة لأي مساحة لاستخدامها في تعبير XPath الخاص بك.

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