ฉันทุบหัวตัวเองกับข้อผิดพลาดที่ทำให้โกรธมากในช่วง 48 ชั่วโมงที่ผ่านมาดังนั้นฉันคิดว่าในที่สุดฉันก็โยนผ้าเช็ดตัวและลองถามที่นี่ก่อนที่จะโยนแล็ปท็อปออกไปนอกหน้าต่าง
ฉันกำลังพยายามแยกวิเคราะห์ XML การตอบกลับจากการโทรไปยัง AWS SimpleDB การตอบสนองกลับมาที่สายได้ดี ตัวอย่างเช่นอาจมีลักษณะดังนี้:
<?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
<ListDomainsResult>
<DomainName>Audio</DomainName>
<DomainName>Course</DomainName>
<DomainName>DocumentContents</DomainName>
<DomainName>LectureSet</DomainName>
<DomainName>MetaData</DomainName>
<DomainName>Professors</DomainName>
<DomainName>Tag</DomainName>
</ListDomainsResult>
<ResponseMetadata>
<RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId>
<BoxUsage>0.0000071759</BoxUsage>
</ResponseMetadata>
</ListDomainsResponse>
ฉันส่ง XML นี้ไปยังโปรแกรมแยกวิเคราะห์ด้วย
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
และโทรeventReader.nextEvent();
หลายครั้งเพื่อรับข้อมูลที่ฉันต้องการ
นี่คือส่วนที่แปลกประหลาด - มันใช้งานได้ดีในเซิร์ฟเวอร์ท้องถิ่น เสียงตอบรับเข้ามาฉันแยกวิเคราะห์ทุกคนมีความสุข ปัญหาคือเมื่อฉันปรับใช้โค้ดกับ Google App Engine คำขอส่งออกยังคงใช้งานได้และ XML การตอบกลับดูเหมือน 100% และถูกต้องสำหรับฉัน แต่การตอบกลับไม่สามารถแยกวิเคราะห์ได้โดยมีข้อยกเว้นต่อไปนี้:
com.amazonaws.http.HttpClient handleResponse: Unable to unmarshall response (ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.): <?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"><ListDomainsResult><DomainName>Audio</DomainName><DomainName>Course</DomainName><DomainName>DocumentContents</DomainName><DomainName>LectureSet</DomainName><DomainName>MetaData</DomainName><DomainName>Professors</DomainName><DomainName>Tag</DomainName></ListDomainsResult><ResponseMetadata><RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId><BoxUsage>0.0000071759</BoxUsage></ResponseMetadata></ListDomainsResponse>
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(Unknown Source)
at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(Unknown Source)
at com.amazonaws.transform.StaxUnmarshallerContext.nextEvent(StaxUnmarshallerContext.java:153)
... (rest of lines omitted)
ฉันได้ตรวจสอบ XML นี้เป็นสองเท่าสามเท่าสี่เท่าสำหรับ 'อักขระที่มองไม่เห็น' หรืออักขระที่เข้ารหัสที่ไม่ใช่ UTF8 เป็นต้นฉันดูที่มันเป็นไบต์ต่อไบต์ในอาร์เรย์เพื่อหาเครื่องหมายไบต์ตามลำดับหรือบางอย่างในลักษณะนั้น ไม่มีอะไร; มันผ่านการทดสอบการตรวจสอบความถูกต้องทุกครั้งที่ฉันสามารถทำได้ แม้แต่คนแปลกหน้าก็เกิดขึ้นได้หากฉันใช้ตัวแยกวิเคราะห์ที่ใช้แซกซอนเช่นกัน - แต่เฉพาะใน GAE เท่านั้นที่ทำงานได้ดีในสภาพแวดล้อมในท้องถิ่นของฉัน
ทำให้ยากมากที่จะติดตามโค้ดเพื่อหาปัญหาเมื่อฉันสามารถเรียกใช้ดีบักเกอร์ในสภาพแวดล้อมที่ทำงานได้อย่างสมบูรณ์เท่านั้น (ฉันไม่พบวิธีที่ดีในการดีบักจากระยะไกลบน GAE) อย่างไรก็ตามการใช้วิธีการดั้งเดิมที่ฉันมีฉันได้ลองวิธีการนับล้าน ได้แก่ :
- XML ที่มีและไม่มี prolog
- มีและไม่มีบรรทัดใหม่
- มีและไม่มีแอตทริบิวต์ "encoding =" ใน prolog
- ทั้งรูปแบบขึ้นบรรทัดใหม่
- มีและไม่มีข้อมูลการแบ่งส่วนที่มีอยู่ในสตรีม HTTP
และฉันได้ลองสิ่งเหล่านี้เกือบทั้งหมดในหลาย ๆ ชุดซึ่งมันสมเหตุสมผลแล้วที่พวกเขาจะโต้ตอบ - ไม่มีอะไร! ฉันสิ้นปัญญาแล้ว มีใครเคยเห็นปัญหาเช่นนี้มาก่อนซึ่งหวังว่าจะได้รับความกระจ่างบ้าง?
ขอบคุณ!