مدقق XML
التحقق من صحة بنية XML واكتشاف أخطاء التركيب
إدخال XML
ما هو التحقق من صحة XML؟
يتحقق مدقق XML مما إذا كان مستند XML يتبع القواعد البنيوية التي تحددها مواصفة XML 1.0 (توصية W3C، الطبعة الخامسة). يتأكد هذا المدقق في حده الأدنى من أن المستند سليم التركيب: يحتوي على عنصر جذر واحد، وتكون جميع الوسوم متداخلة ومغلقة بصورة صحيحة، وقيم الخصائص بين علامات اقتباس، والأحرف المحجوزة مستبدلة بكيانات محددة مسبقًا. أي مستند يخفق في أي من هذه الفحوصات سيتسبب في إلقاء المحللات لأخطاء بدلًا من إنتاج نتائج خاطئة بصمت.
يكتسب التمييز بين السلامة البنيوية والصحة الكاملة أهمية بالغة. مستند XML سليم التركيب يستوفي قواعد النحو المحددة في مواصفة XML ذاتها. أما مستند XML صالح فيذهب أبعد من ذلك: يتوافق أيضًا مع القيود المعرَّفة في مخطط خارجي، كـDTD (Document Type Definition) أو XSD (XML Schema Definition) أو مخطط Relax NG. تتحقق هذه الأداة من السلامة البنيوية، وهي الخطوة الأولى والأكثر شيوعًا في عملية التحقق. بدونها لا يمكن لأي شيء لاحق في سلسلة المعالجة أن يتقدم.
يكتشف التحقق من صحة XML الأخطاء قبل أن تصل إلى بيئة الإنتاج. الوسوم غير المغلقة وأسماء العناصر غير المتطابقة والرموز & غير المُبدَّلة والخصائص المكررة من أكثر الأخطاء شيوعًا في ملفات XML المحررة يدويًا. تتعامل المحللات في لغات مختلفة مع هذه الأخطاء بأساليب متباينة: بعضها يفشل بصمت، وبعضها يُعيد نتائج جزئية، وبعضها يُلقي استثناءات. تمرير XML عبر المدقق أولًا يُزيل هذا الغموض ويمنحك إجابة واضحة بالنجاح أو الفشل مع تفاصيل موضع الخطأ.
لماذا تستخدم مدقق XML إلكترونيًا؟
اكتشاف أخطاء بنية XML مبكرًا يمنع الأعطال المتسلسلة في التطبيقات التي تستهلك بيانات XML. يمنحك المدقق المستند إلى المتصفح تغذية راجعة فورية دون الحاجة إلى تثبيت أدوات سطر الأوامر أو ضبط إضافات بيئات التطوير المتكاملة.
حالات استخدام مدقق XML
قواعد السلامة البنيوية في XML
تحدد مواصفة XML 1.0 مجموعة صارمة من قواعد النحو. يجب أن يستوفي المستند جميعها ليُعدَّ سليم التركيب. يسرد الجدول أدناه كل قاعدة وما تستلزمه ومثالًا صحيحًا عليها. معظم أخطاء التحقق ترجع إلى إحدى هذه القواعد.
| القاعدة | المتطلب | مثال صحيح |
|---|---|---|
| Single root element | Document must have exactly one root | <root>...</root> |
| Matched tags | Every opening tag needs a closing tag | <p>text</p> |
| Proper nesting | Tags must close in reverse order of opening | <a><b>...</b></a> |
| Quoted attributes | Attribute values must be in single or double quotes | <el attr="val"/> |
| Entity escaping | Reserved characters must use predefined entities | < > & " ' |
| Case sensitivity | Tag names are case-sensitive: <A> is not </a> | <Book>...</Book> |
| No duplicate attributes | Each attribute name must appear once per element | <el a="1" b="2"/> |
| Valid XML declaration | If present, must be the very first line | <?xml version="1.0"?> |
السليم بنيويًا مقابل الصالح وفق DTD مقابل الصالح وفق المخطط
للتحقق من صحة XML ثلاثة مستويات. تفحص هذه الأداة المستوى الأول (السلامة البنيوية)، وهو شرط أساسي للمستويين الآخرين.
أمثلة على الكود
تحقق من صحة XML برمجيًا في لغات مختلفة. يفحص كل مثال السلامة البنيوية ويُعيد رسالة الخطأ إذا كان المستند مشوّهًا.
function validateXML(xmlString) {
const parser = new DOMParser()
const doc = parser.parseFromString(xmlString, 'application/xml')
const error = doc.querySelector('parsererror')
if (error) {
return { valid: false, message: error.textContent }
}
return { valid: true, message: 'Well-formed XML' }
}
validateXML('<root><item>hello</item></root>')
// → { valid: true, message: "Well-formed XML" }
validateXML('<root><item>hello</root>')
// → { valid: false, message: "Opening and ending tag mismatch..." }import xml.etree.ElementTree as ET
def validate_xml(xml_string):
try:
ET.fromstring(xml_string)
return True, "Well-formed XML"
except ET.ParseError as e:
return False, str(e)
valid, msg = validate_xml('<root><item>hello</item></root>')
# → (True, "Well-formed XML")
valid, msg = validate_xml('<root><item>hello</root>')
# → (False, "mismatched tag: line 1, column 27")
# With lxml — also supports XSD schema validation
from lxml import etree
schema = etree.XMLSchema(etree.parse('schema.xsd'))
doc = etree.fromstring(b'<root><item>hello</item></root>')
schema.validate(doc) # → True or Falsepackage main
import (
"encoding/xml"
"fmt"
"strings"
)
func validateXML(raw string) error {
decoder := xml.NewDecoder(strings.NewReader(raw))
for {
_, err := decoder.Token()
if err != nil {
if err.Error() == "EOF" {
return nil
}
return err
}
}
}
func main() {
err := validateXML("<root><item>hello</item></root>")
fmt.Println(err) // → <nil>
err = validateXML("<root><item>hello</root>")
fmt.Println(err) // → XML syntax error: unexpected end element </root>
}# Check well-formedness (part of libxml2, pre-installed on macOS/Linux) xmllint --noout document.xml # Exit code 0 = valid, non-zero = errors printed to stderr # Validate against an XSD schema xmllint --noout --schema schema.xsd document.xml # Validate against a DTD xmllint --noout --dtdvalid schema.dtd document.xml # Validate from stdin echo '<root><unclosed>' | xmllint --noout - # → :1: parser error : Premature end of data in tag unclosed line 1