When the XML parser faced with Invalid XML Characters

เพิ่งเจอปัญหาตอน parse XML ที่เก็บข้อมูล Audit Log ไว้บน database ตอน parse  พบว่าโดน error messages แบบนี้เข้าไป org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0x1a)  ปัญหานี้น้องในทีมเจอครับ เบื้องต้นได้รับแจ้งมาว่า “พี่ๆ มัน parse ภาษาไทยไม่ได้” … เอาแล้วเว้ย ปกติก็ไม่เคยเจอแบบนี้เพราะปกติมันก็ผ่านด้วยดีนี่หว่า

ก็กลับมาลองบนเครื่องตัวเองลองกรอกภาษาไทยลงไปก็พบว่าทำงานได้ … เลยเริ่มสงสัยว่าทำไมเครื่องน้องถึงมีปัญหา เลยขอเข้าไป query ไปดู raw data ใน database ซะหน่อยก็ถึงบางอ้อ เพราะข้อมูลที่เก็บนั้นมันมี characters แปลกๆ แทรกอยู่้ใน xml data

ประมาณนี้ครับ

<audit-record><audit-entry dataType=”Text”><name>Customer ID</name><value>427588</value></audit-entry><audit-entry dataType=”Text”><name>First Name</name><value> </value></audit-entry><audit-entry dataType=”Text”><name>Last Name</name><value> </value></audit-entry><audit-entry dataType=”Text”><name>Email Address</name><value>siripods@stream.co.th</value></audit-entry><audit-entry dataType=”Text”><name>Fax Number</name><value> </value></audit-entry><audit-entry dataType=”Text”><name>Mobile Phone</name><value>0811111111</value></audit-entry><audit-entry dataType=”Text”><name>Work Phone </name><value>022222222</value></audit-entry><audit-entry dataType=”Text”><name>Work Phone </name><value>033333333</value></audit-entry><audit-entry dataType=”Text”><name>Middle Name</name><value> </value></audit-entry><audit-entry dataType=”Text”><name>Title</name><value> </value></audit-entry><audit-entry dataType=”Text”><name>Citizen ID/Passport No./Tax ID</name><value>3771004950</value></audit-entry><audit-entry dataType=”Text”><name>Suffix</name><value> </value></audit-entry><audit-entry dataType=”Text”><name>Address 1</name><value></value></audit-entry><audit-entry dataType=”Text”><name>Address 2</name><value></value></audit-entry><audit-entry dataType=”Text”><name>Address 3</name><value></value></audit-entry><audit-entry dataType=”Text”><name>City</name><value></value></audit-entry><audit-entry dataType=”Text”><name>Country</name><value> </value></audit-entry><audit-entry dataType=”Text”><name>State/Region</name><value> </value></audit-entry><audit-entry dataType=”Text”><name>Postal Code</name><value></value></audit-entry></audit-record>

ไอ้ตรงสีแดงๆ นี่แหละครับ ตัวปัญหา สิ่งที่ต้องทำคือ filter มันออกไปครับ สิ่งที่คิดคือจะเข้าไป replace ใน element ที่มีปัญหาด้วย space ทั้งหมด … แต่ลองแล้วทำไมได้เพราะ parse XML ไม่ได้ มันติดปัญหาเดิม … เลยจำใจต้อง skip record ที่มีปัญหาไปทั้งหมด ..  (ใครมี idea ดีๆ แนะนำหน่อยนะครับ)

วิธี filter ก็เขียนเป็น method ประมาณนี้ครับ

public static boolean stripNonValidXMLCharacters(String in) {

boolean valid = false;
char current;

if (in == null || (“”.equals(in))) {
return true;
}

for (int i = 0; i < in.length(); i++) {

current = in.charAt(i);

if ((current == 0x9) ||
(current == 0xA) ||
(current == 0xD) ||
((current >= 0x20) && (current <= 0xD7FF)) ||
((current >= 0xE000) && (current <= 0xFFFD)) ||
((current >= 0x10000) && (current <= 0x10FFFF))) {

valid = true;

} else {

valid = false;
return valid;

}
}

return valid;

}

ทดสอบดูก็พบว่าทำงานได้ดี

One thought on “When the XML parser faced with Invalid XML Characters”

  1. not well-formed (invalid token)

    ,not well-formed (invalid token),

    พี่ครับผมเจอปัญหาแบบนี้ครับ ขอวิธีแก้หน่อย

Leave a Reply

Your email address will not be published. Required fields are marked *