ToolDeck

ตัวตรวจสอบ XML

ตรวจสอบไวยากรณ์ XML และข้อผิดพลาด well-formedness

ลองตัวอย่าง

ป้อนข้อมูล XML

ประมวลผลในเครื่อง · ปลอดภัยในการวางข้อมูลลับ

XML Validation คืออะไร?

ตัวตรวจสอบ XML ตรวจสอบว่าเอกสาร XML ปฏิบัติตามกฎโครงสร้างที่กำหนดโดยข้อกำหนด XML 1.0 (W3C Recommendation ฉบับที่ห้า) หรือไม่ อย่างน้อยที่สุด ตัวตรวจสอบนี้ยืนยันว่าเอกสารเป็น well-formed: มี root element เพียงหนึ่งตัว ทุก tag ซ้อนกันและปิดอย่างถูกต้อง ค่า attribute อยู่ในเครื่องหมายอัญประกาศ และอักขระสงวนใช้ entity ที่กำหนดไว้ล่วงหน้า เอกสารที่ล้มเหลวในการตรวจสอบเหล่านี้จะทำให้ XML parser เกิดข้อผิดพลาดแทนที่จะสร้างผลลัพธ์ที่ผิดพลาดอย่างเงียบๆ

ความแตกต่างระหว่าง well-formedness และ validity มีความสำคัญ เอกสาร XML ที่ well-formed ปฏิบัติตามกฎไวยากรณ์ของข้อกำหนด XML เอง เอกสาร XML ที่ valid ไปไกลกว่านั้น: ยังสอดคล้องกับข้อจำกัดที่กำหนดในสคีมาภายนอก เช่น DTD (Document Type Definition), XSD (XML Schema Definition) หรือ Relax NG schema เครื่องมือนี้ตรวจสอบ well-formedness ซึ่งเป็นขั้นตอนการตรวจสอบขั้นแรกและพบบ่อยที่สุด หากขาดขั้นตอนนี้ ทุกอย่างในกระบวนการต่อไปจะดำเนินการไม่ได้

XML validation ตรวจจับข้อผิดพลาดก่อนที่จะถึง production แท็กที่ยังไม่ปิด ชื่อ element ที่ไม่ตรงกัน ampersand ที่ไม่ได้ escape และ attribute ที่ซ้ำกันเป็นข้อผิดพลาดที่พบบ่อยที่สุดใน XML ที่แก้ไขด้วยมือ Parser ในภาษาต่างๆ จัดการข้อผิดพลาดเหล่านี้แตกต่างกัน: บางตัวล้มเหลวอย่างเงียบๆ บางตัวคืนค่าผลลัพธ์บางส่วน และบางตัวโยน exception การรัน XML ผ่านตัวตรวจสอบก่อนขจัดความกำกวมนี้และให้คำตอบที่ชัดเจนว่าผ่านหรือไม่ผ่านพร้อมรายละเอียดตำแหน่งข้อผิดพลาด

ทำไมต้องใช้ตัวตรวจสอบ XML ออนไลน์?

การตรวจจับข้อผิดพลาดไวยากรณ์ XML ตั้งแต่เนิ่นๆ ป้องกันความล้มเหลวแบบลูกโซ่ในแอปพลิเคชันที่ใช้ข้อมูล XML ตัวตรวจสอบบนเบราว์เซอร์ให้ผลตอบกลับทันทีโดยไม่ต้องติดตั้ง command-line tool หรือกำหนดค่า IDE plugin

ตรวจจับข้อผิดพลาดได้ทันที
วาง XML แล้วรับผลลัพธ์ผ่านหรือไม่ผ่านพร้อมตำแหน่งข้อผิดพลาดแม่นยำภายในไม่ถึงวินาที ไม่ต้องรอ build pipeline หรือตั้งค่า CLI tool
🔒
ประมวลผลโดยให้ความเป็นส่วนตัวก่อน
การแยกวิเคราะห์และการตรวจสอบทั้งหมดเกิดขึ้นในเบราว์เซอร์โดยใช้ DOMParser API ข้อมูล XML ของคุณไม่เคยออกจากเครื่องและไม่เคยถูกส่งไปยังเซิร์ฟเวอร์ใด
🎯
รายงานข้อผิดพลาดแม่นยำ
เห็นบรรทัดและคอลัมน์ที่แน่นอนที่การตรวจสอบล้มเหลวพร้อมคำอธิบายข้อผิดพลาด ซึ่งเร็วกว่าการอ่าน stack trace จาก parser ในโค้ดแอปพลิเคชันของคุณ
📋
ไม่ต้องมีบัญชีหรือติดตั้ง
เปิดหน้า วาง XML และดูผลลัพธ์ ไม่มีแบบฟอร์มลงทะเบียน ไม่มีซอฟต์แวร์บนเดสก์ท็อป ไม่ต้องมีส่วนขยายเบราว์เซอร์

กรณีการใช้งานตัวตรวจสอบ XML

การพัฒนา frontend
ตรวจสอบไฟล์ SVG และ XHTML fragment ก่อนฝังใน React หรือ Vue component แท็กที่ยังไม่ปิดเพียงแท็กเดียวใน SVG สามารถทำให้ component tree ทั้งหมดพัง
วิศวกรรม backend
ตรวจสอบ SOAP response, XML-RPC payload และ RSS/Atom feed จาก API ของบุคคลที่สาม ตรวจสอบ response ดิบก่อนเขียน logic การ deserialize เพื่อหลีกเลี่ยงการ debug parser exception ขณะ runtime
DevOps และ CI/CD
ตรวจสอบว่าไฟล์ Maven pom.xml, .csproj หรือ Ant build เป็น well-formed หลังการแก้ไขอัตโนมัติ ข้อผิดพลาดไวยากรณ์ใน build config อาจทำให้ pipeline ทั้งหมดล้มเหลวพร้อมข้อความ error ที่เข้าใจยาก
QA และการทดสอบ
ตรวจสอบ XML test fixture และไฟล์ expected-output ก่อนรัน integration test fixture ที่ malformed ทำให้เกิด false negative ที่สิ้นเปลือง debug time
วิศวกรรมข้อมูล
ตรวจสอบ XML ที่ส่งออกจากฐานข้อมูล พอร์ทัลข้อมูลเปิดของรัฐบาล และ ETL pipeline การตรวจสอบโครงสร้างก่อนเขียน XPath query หรือ XSLT transform ป้องกันความพยายามที่สูญเปล่ากับข้อมูลต้นทางที่เสีย
การเรียนรู้ XML
นักเรียนที่ศึกษา XML หรือ XSLT tutorial ของ W3C สามารถวางไฟล์แบบฝึกหัดลงในตัวตรวจสอบเพื่อตรวจสอบไวยากรณ์ ข้อความ error ชี้ไปยังปัญหาที่แน่นอน ช่วยเร่งกระบวนการเรียนรู้

กฎ Well-Formedness ของ XML

ข้อกำหนด XML 1.0 กำหนดชุดกฎไวยากรณ์ที่เข้มงวด เอกสารต้องปฏิบัติตามกฎทั้งหมดจึงจะถือว่าเป็น well-formed ตารางด้านล่างแสดงแต่ละกฎ สิ่งที่กำหนด และตัวอย่างที่ถูกต้อง ข้อผิดพลาดในการตรวจสอบส่วนใหญ่เกิดจากกฎเหล่านี้

กฎข้อกำหนดตัวอย่างที่ถูกต้อง
Single root elementDocument must have exactly one root<root>...</root>
Matched tagsEvery opening tag needs a closing tag<p>text</p>
Proper nestingTags must close in reverse order of opening<a><b>...</b></a>
Quoted attributesAttribute values must be in single or double quotes<el attr="val"/>
Entity escapingReserved characters must use predefined entities&lt; &gt; &amp; &quot; &apos;
Case sensitivityTag names are case-sensitive: <A> is not </a><Book>...</Book>
No duplicate attributesEach attribute name must appear once per element<el a="1" b="2"/>
Valid XML declarationIf present, must be the very first line<?xml version="1.0"?>

Well-Formed vs. DTD-Valid vs. Schema-Valid

XML validation มีสามระดับ เครื่องมือนี้ตรวจสอบระดับแรก (well-formedness) ซึ่งเป็นเงื่อนไขเบื้องต้นสำหรับอีกสองระดับ

Well-formed
ปฏิบัติตามกฎไวยากรณ์ XML 1.0: root element เดียว tag ที่ตรงกัน attribute ในเครื่องหมายอัญประกาศ และการซ้อนที่ถูกต้อง ทุก XML parser ตรวจสอบสิ่งนี้ก่อน หากเอกสารไม่ใช่ well-formed ก็ไม่ใช่ XML เลย
DTD-valid
สอดคล้องกับ Document Type Definition ที่ระบุว่า element และ attribute ใดได้รับอนุญาต ลำดับและจำนวน DTD ประกาศแบบ inline หรือผ่าน DOCTYPE reference DTD validation พบบ่อยในระบบเก่าและ XHTML
Schema-valid (XSD / Relax NG)
สอดคล้องกับ XML Schema Definition (XSD) หรือ Relax NG schema สคีมาเหล่านี้รองรับชนิดข้อมูล (integer, date, URI) namespace และ content model ที่ซับซ้อน XSD validation เป็นมาตรฐานใน SOAP web service ข้อมูลการแพทย์ HL7 และ enterprise integration

ตัวอย่างโค้ด

ตรวจสอบ XML ด้วยโปรแกรมในภาษาต่างๆ แต่ละตัวอย่างตรวจสอบ well-formedness และคืนค่าข้อความ error หากเอกสาร malformed

JavaScript (DOMParser)
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..." }
Python
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 False
Go
package 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>
}
CLI (xmllint)
# 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

คำถามที่พบบ่อย

ความแตกต่างระหว่าง XML ที่ well-formed และ XML ที่ valid คืออะไร?
XML ที่ well-formed ปฏิบัติตามกฎไวยากรณ์ของข้อกำหนด XML 1.0: root element หนึ่งตัว tag ที่ตรงกันและซ้อนอย่างถูกต้อง attribute ในเครื่องหมายอัญประกาศ XML ที่ valid ไปไกลกว่าโดยยังสอดคล้องกับ DTD หรือ XSD schema ที่กำหนดว่า element, attribute และชนิดข้อมูลใดได้รับอนุญาต เอกสารอาจเป็น well-formed แต่ไม่ valid หากมีไวยากรณ์ที่ถูกต้องแต่ละเมิดข้อจำกัดของสคีมา
เอกสาร XML สามารถ valid แต่ไม่ well-formed ได้หรือไม่?
ไม่ได้ Well-formedness เป็นเงื่อนไขเบื้องต้นสำหรับ validity หากเอกสารละเมิดกฎไวยากรณ์ XML ใด (แท็กที่ยังไม่ปิด attribute ที่ไม่มีเครื่องหมายอัญประกาศ เป็นต้น) parser ไม่สามารถสร้าง tree จากเอกสารนั้นได้ ดังนั้น schema validation จึงเริ่มต้นไม่ได้เลย แก้ไขข้อผิดพลาด well-formedness ก่อน แล้วจึงตรวจสอบกับสคีมา
ข้อผิดพลาด XML validation ที่พบบ่อยที่สุดมีอะไรบ้าง?
ห้าข้อผิดพลาดที่พบบ่อยที่สุดได้แก่: แท็กที่ยังไม่ปิดหรือไม่ตรงกัน ampersand ที่ไม่ได้ escape ในเนื้อหาข้อความ ค่า attribute ที่ไม่มีเครื่องหมายอัญประกาศ ขาด root element และตัวพิมพ์ผิดในชื่อ tag (XML คำนึงถึงตัวพิมพ์เล็กใหญ่) ข้อผิดพลาดส่วนใหญ่เกิดจากการแก้ไข XML ด้วยมือหรือการต่อ string ในโค้ดแทนที่จะใช้ XML serializer ที่เหมาะสม
XML validation เหมือนกับ XML linting หรือไม่?
มีส่วนทับซ้อนกันแต่ไม่เหมือนกัน Validation ตรวจสอบว่าเอกสารสอดคล้องกับข้อกำหนด XML (well-formedness) หรือสคีมา (DTD/XSD) Linting มักไปไกลกว่าโดยยังตรวจจับปัญหาสไตล์: การย่อหน้าที่ไม่สม่ำเสมอ การประกาศ namespace ที่ไม่ได้ใช้ หรือค่า attribute เริ่มต้นที่ซ้ำซ้อน xmllint จาก libxml2 รวมทั้งสองอย่าง: --noout ตรวจสอบ well-formedness ในขณะที่ --schema เพิ่ม XSD validation
XML validation แตกต่างจาก JSON validation อย่างไร?
XML มี grammar ที่เข้มงวดและซับซ้อนกว่า JSON XML ต้องมี tag เปิด/ปิดที่ตรงกัน รองรับ attribute, namespace, mixed content (ข้อความและ element ร่วมกัน) และมีภาษาสคีมาหลายตัว (DTD, XSD, Relax NG, Schematron) JSON validation ตรวจสอบการจับคู่ brace/bracket key ที่อยู่ในเครื่องหมายอัญประกาศ และตำแหน่ง comma JSON Schema มีอยู่แต่ง่ายกว่า XSD เอกสาร XML มักใหญ่กว่า JSON ที่เทียบเท่าสำหรับข้อมูลเดียวกัน 2-3 เท่า
เครื่องมือนี้ตรวจสอบกับ XSD หรือ DTD schema หรือไม่?
เครื่องมือนี้ตรวจสอบเฉพาะ well-formedness เท่านั้น: ยืนยันว่า XML ของคุณปฏิบัติตามกฎไวยากรณ์ของข้อกำหนด XML 1.0 ไม่ได้ตรวจสอบกับ DTD หรือ XSD schema ภายนอก สำหรับ schema validation ใช้ xmllint --schema บน command line หรือ lxml ใน Python ซึ่งรองรับทั้ง XSD และ Relax NG
ทำไม XML ของฉันจึงตรวจสอบไม่ผ่านทั้งที่ดูถูกต้อง?
สาเหตุที่มองไม่เห็นที่พบบ่อยที่สุดได้แก่: byte order mark (BOM) ก่อน XML declaration อักขระหลงหลังจาก closing root tag ampersand ที่ไม่ได้ escape ในเนื้อหาข้อความ (ใช้ &amp; แทน) หรือ namespace prefix ที่ใช้งานแต่ไม่เคยประกาศ คัดลอก XML ของคุณไปยัง hex viewer หรือรันผ่าน xmllint --noout เพื่อรับตำแหน่ง byte ที่แน่นอนของข้อผิดพลาด