پروژه: مدیریت کتابخانه
پروژه عملی کامل — سیستم مدیریت کتابخانه با 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 است.