پروژه: مدیریت کتابخانه

پروژه عملی کامل — سیستم مدیریت کتابخانه با XML، PHP و اعتبارسنجی XSD

پروژه پایانی: سیستم مدیریت کتابخانه XML

در این پروژه همه آموخته‌های دوره را کنار هم می‌گذاریم: طراحی ساختار XML، اعتبارسنجی با XSD، خواندن و نوشتن با PHP و تولید خروجی JSON و HTML.

مرحله ۱: طراحی ساختار داده

اول مشخص می‌کنیم کتابخانه چه داده‌ای دارد:

<library>
    <book id="B001" category="programming" available="true">
        <title lang="fa">آموزش XML</title>
        <authors>
            <author>سارا محمدی</author>
        </authors>
        <year>2024</year>
        <price currency="IRR">95000</price>
    </book>
</library>

مرحله ۲: تعریف Schema (XSD)

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="library">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="book" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="title">
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="xs:string">
                                            <xs:attribute name="lang" type="xs:string"/>
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="authors">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="author" type="xs:string"
                                                    maxOccurs="unbounded"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="year">
                                <xs:simpleType>
                                    <xs:restriction base="xs:integer">
                                        <xs:minInclusive value="1900"/>
                                        <xs:maxInclusive value="2100"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="price" type="xs:decimal"/>
                        </xs:sequence>
                        <xs:attribute name="id" use="required">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:pattern value="B[0-9]{3}"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:attribute>
                        <xs:attribute name="category" type="xs:string"/>
                        <xs:attribute name="available" type="xs:boolean"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

مرحله ۳: کلاس مدیریت کتابخانه (PHP)

<?php
class LibraryManager
{
    private SimpleXMLElement $xml;
    private string $file;

    public function __construct(string $file)
    {
        $this->file = $file;
        $this->xml = simplexml_load_file($file);
    }

    // جستجو با XPath
    public function search(string $query): array
    {
        return $this->xml->xpath(
            "//book[contains(title, '{$query}')]"
        ) ?? [];
    }

    // کتاب‌های موجود
    public function getAvailable(): array
    {
        return $this->xml->xpath(
            '//book[@available="true"]'
        ) ?? [];
    }

    // افزودن کتاب جدید
    public function addBook(array $data): bool
    {
        $book = $this->xml->addChild("book");
        $book->addAttribute("id", $data['id']);
        $book->addAttribute("category", $data['category']);
        $book->addAttribute("available", "true");

        $title = $book->addChild("title", $data['title']);
        $title->addAttribute("lang", "fa");

        $authors = $book->addChild("authors");
        foreach ($data['authors'] as $author) {
            $authors->addChild("author", htmlspecialchars($author));
        }

        $book->addChild("year", $data['year']);
        $price = $book->addChild("price", $data['price']);
        $price->addAttribute("currency", "IRR");

        return $this->xml->asXML($this->file) !== false;
    }

    // امانت دادن کتاب
    public function borrow(string $id): bool
    {
        $book = $this->xml->xpath("//book[@id='{$id}']")[0] ?? null;
        if (!$book || $book['available'] != 'true') {
            return false;
        }
        $book['available'] = 'false';
        return $this->xml->asXML($this->file) !== false;
    }

    // خروجی JSON برای API
    public function toJson(): string
    {
        return json_encode($this->xml, JSON_UNESCAPED_UNICODE);
    }

    // آمار
    public function stats(): array
    {
        $all = count($this->xml->book);
        $available = count($this->getAvailable());
        return [
            'total' => $all,
            'available' => $available,
            'borrowed' => $all - $available,
        ];
    }
}

مرحله ۴: استفاده از سیستم

$lib = new LibraryManager("library.xml");

// افزودن کتاب
$lib->addBook([
    'id' => 'B002',
    'category' => 'web',
    'title' => 'آموزش XPath',
    'authors' => ['علی رضایی'],
    'year' => 2025,
    'price' => 85000,
]);

// امانت دادن
$lib->borrow("B001");

// آمار
print_r($lib->stats());
// ['total' => 2, 'available' => 1, 'borrowed' => 1]

// خروجی API
header('Content-Type: application/json; charset=UTF-8');
echo $lib->toJson();

مرحله ۵: اعتبارسنجی داده‌ها

$doc = new DOMDocument();
$doc->load("library.xml");

if ($doc->schemaValidate("library.xsd")) {
    echo "داده‌ها معتبرند ✅";
}

چه یاد گرفتیم؟

مهارتکجا استفاده شد
طراحی ساختار XMLمدل داده کتابخانه
ویژگی در برابر عنصرid و category ویژگی، title عنصر
XML Schemaاعتبارسنجی id و سال
SimpleXMLخواندن و نوشتن
XPathجستجو و فیلتر
امنیتhtmlspecialchars برای ورودی
تبدیل فرمتخروجی JSON برای API
تبریک! 🎉 شما حالا XML را از صفر تا پروژه واقعی یاد گرفتید. این سیستم را گسترش دهید: تاریخ امانت، جریمه تأخیر، خروجی RSS از کتاب‌های جدید، یا حتی یک رابط HTML با fetch!

این مبحث بخشی از دوره آموزش کامل XML است.

ابزارهای مرتبط