org.xml.sax.SAXParseException: ไม่อนุญาตเนื้อหาใน prolog


161

ฉันมีไคลเอนต์บริการเว็บที่ใช้ Java เชื่อมต่อกับบริการเว็บ Java (นำไปใช้กับ Framework1 Axis)

ฉันได้รับข้อยกเว้นต่อไปนี้ในไฟล์บันทึกของฉัน:

Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog.
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(Unknown Source)
    at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
    at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
    at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
    at org.apache.ws.axis.security.WSDoAllReceiver.invoke(WSDoAllReceiver.java:114)
    at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
    at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
    at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:198)
    at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
    at org.apache.axis.client.Call.invoke(Call.java:2767)
    at org.apache.axis.client.Call.invoke(Call.java:2443)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)

11
มันจะช่วยถ้าคุณแสดงให้เราเห็น XML ที่คุณพยายามแยกวิเคราะห์ (เพียงไม่กี่บรรทัดแรกจะทำผมคาดว่า.)
สตีเฟ่น C

ขอบคุณ Stephen ฉันพยายามดึงคำขอ XML จากกรอบ AXIS และวางไว้ที่นี่ ดังนั้นความเข้าใจโดยทั่วไปเกี่ยวกับข้อผิดพลาดข้างต้นคือ XML นั้นไม่ได้เกิดขึ้น
ag112

ฉันมีปัญหานี้เพราะฉันพยายามเปลี่ยนชื่อสตริงของไฟล์ xml แทนที่จะเป็นไฟล์ xml! : P
Gaʀʀʏ

คำตอบ:


242

ปัญหานี้มักเกิดจากช่องว่างก่อนการประกาศ XML แต่อาจเป็นข้อความใด ๆเช่นเส้นประหรืออักขระใด ๆ ฉันมักจะพูดว่าเกิดจากพื้นที่สีขาวเพราะคนคิดว่าพื้นที่สีขาวเป็นจุดอ่อนเสมอ แต่นั่นไม่ใช่กรณีที่นี่


อีกสิ่งหนึ่งที่มักเกิดขึ้นคือUTF-8 BOM (เครื่องหมายคำสั่งซื้อไบต์) ซึ่งก็คือได้รับอนุญาตก่อนที่จะประกาศ XML สามารถจะถือว่าเป็นช่องว่างถ้าเอกสารที่ถูกส่งเป็นกระแสของตัวละครไปสู่การแยกวิเคราะห์ XML มากกว่าที่จะเป็นกระแสของไบต์ .

เช่นเดียวกับที่เกิดขึ้นถ้าไฟล์สคี (.xsd) ถูกนำมาใช้ในการตรวจสอบไฟล์ xml และเป็นหนึ่งในไฟล์สคีมีUTF-8 BOM


17
สำหรับทุกคนอย่างฉันที่ดิ้นรนที่จะเข้าใจว่าจะทำอย่างไรกับ John Humphreys - ข้อเสนอแนะของ w00te: เปลี่ยนDocument document = documentBuilder.parse(new InputSource(new StringReader(xml)))เป็นDocument document = documentBuilder.parse(new InputSource(new ByteArrayInputStream(xml.getBytes("UTF-8"))))
RealMan

32

ที่จริงนอกเหนือจากโพสต์ของ Yuriy Zubarev

เมื่อคุณส่งไฟล์ xml ที่ไม่มีอยู่ไปยังตัวแยกวิเคราะห์ ตัวอย่างเช่นคุณผ่าน

new File("C:/temp/abc")

เมื่อมีเฉพาะไฟล์ C: /temp/abc.xml ในระบบไฟล์ของคุณ

ไม่ว่าในกรณีใด

builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
document = builder.parse(new File("C:/temp/abc"));

หรือ

DOMParser parser = new DOMParser();
parser.parse("file:C:/temp/abc");

ทุกข้อความแสดงข้อผิดพลาดเดียวกัน

ข้อผิดพลาดที่น่าผิดหวังมากเพราะการติดตามดังต่อไปนี้

javax.servlet.ServletException
    at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
...
Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog.
... 40 more

ไม่ได้พูดอะไรเกี่ยวกับความจริงของ 'ชื่อไฟล์ไม่ถูกต้อง' หรือ 'ไม่มีไฟล์ดังกล่าว' ในกรณีของฉันฉันถูกต้องไฟล์ xml อย่างถูกต้องและต้องใช้เวลา 2 วันเพื่อตรวจสอบปัญหาที่แท้จริง


เช่นเดียวกันกับการพยายามแยกไดเรกทอรีแทนที่จะเป็นชื่อไฟล์ FWIW
rogerdpack

... @Egor นี่คือสาเหตุที่ทุกคนเกลียด XML เสียเวลาทำงาน 2 วันสำหรับความล้มเหลวที่โง่เขลา ..
Gewure

เห็นด้วยอย่างแน่นอน @Gewure :) นั่นคือบางโพสต์โบราณจาก 2012 และฉันก็ลืมมัน แต่จริง
Egor

1
สิ่งนี้จะเกิดขึ้นเมื่อคุณมีเส้นทางที่ถูกต้อง แต่มีสัญลักษณ์พิเศษเช่น: C: \ # MyFolder \ My.XML ไฟล์มีอยู่ แต่ "#" จะทำให้เกิดปัญหากับตัวแยกวิเคราะห์ XML ... Java เองเช่นเดียวกับ M $ Windows ไม่มีปัญหากับชื่อโฟลเดอร์นี้ .... พฤติกรรมข้อความข้อผิดพลาดที่เลวร้ายมาก ....
อเล็กซ์

26

ลองเพิ่มช่องว่างระหว่างencoding="UTF-8"สตริงในบทเปิดฉากและการยกเลิก?>สตริงในอารัมภบทและยุติใน XML prolog จะกำหนดองค์ประกอบที่คั่นด้วยเครื่องหมายวงเล็บคำถามไว้ที่จุดเริ่มต้นของเอกสาร (ในขณะที่ prolog ของแท็กใน stackoverflow อ้างอิงถึงภาษาการเขียนโปรแกรม)

เพิ่ม:นั่นคือเส้นประที่ด้านหน้าของส่วนของเอกสารเปิดฉากของคุณหรือไม่ -<?xml version="1.0" encoding="UTF-8"?>ที่จะเป็นข้อผิดพลาดที่นั่นมีข้อมูลในหน้าของการเปิดฉากที่


1
+1 ฉันได้พบว่าตัวแยกวิเคราะห์ XML บางตัวยกเว้นข้อผิดพลาดนี้แม้เมื่อ XML prolog มีช่องว่าง - ดังนั้นฉันคิดว่ามันคุ้มค่าที่จะตรวจสอบว่าไม่มีอะไรมาก่อน<?xml ver...บิต

11

ฉันมีปัญหาเดียวกัน (และแก้ไขได้) ในขณะที่พยายามแยกวิเคราะห์เอกสาร XML ด้วย freemarker

ฉันไม่มีที่ว่างก่อนส่วนหัวของไฟล์ XML

ปัญหาเกิดขึ้นเมื่อและเมื่อการเข้ารหัสไฟล์และแอตทริบิวต์การเข้ารหัส XML แตกต่างกัน(เช่น: ไฟล์ UTF-8 ที่มีแอตทริบิวต์ UTF-16 ในส่วนหัว)

ดังนั้นฉันจึงมีสองวิธีในการแก้ปัญหา:

  1. การเปลี่ยนการเข้ารหัสไฟล์เอง
  2. การเปลี่ยนส่วนหัว UTF-16 เป็น UTF-8

1
ฉันเดาว่าโดยทั่วไปกรณีใด ๆ ที่ parser ได้รับข้อมูลที่ขัดแย้งกันเกี่ยวกับการเข้ารหัสอักขระอาจทำให้เกิดปัญหานี้
Raedwald

9

หมายความว่า XML ผิดรูปแบบหรือเนื้อหาการตอบสนองไม่ใช่เอกสาร XML เลย


ฉันตรวจสอบแล้วและดูเหมือนว่า XML มีรูปแบบที่ดี นี่คือภาพรวม: - <? xml version = "1.0" encoding = "UTF-8"?> <soapenv: ซองจดหมาย xmlns: soapenv = " schemas.xmlsoap.org/soap/envelope " xmlns: xsd = " w3.org/ 2001 / XMLSchema "xmlns: xsi =" w3.org/2001/XMLSchema-instance "> <soapenv: ส่วนหัว> <wsse: ความปลอดภัย xmlns: wsse =" docs.oasis-open.org/wss/2004/01/ เป็นต้น " soapenv: mustUnderstand = "1"> .... </ wsse: ความปลอดภัย> </ soapenv: ส่วนหัว> <soapenv: ร่างกาย> .XX .. </ soapenv: ร่างกาย> </ soapenv: ซองจดหมาย
ag112

1
ใช่ถ้ามีเส้นประอยู่ด้านหน้ามันจะทำให้ XML แตก
Yuriy Zubarev

7

ใช้เวลาเพียง 4 ชั่วโมงในการติดตามปัญหาที่คล้ายกันใน WSDL ปรากฎว่า WSDL ใช้ XSD ซึ่งอิมพอร์ตเนมสเปซ XSD อื่น XSD ที่นำเข้านี้มีสิ่งต่อไปนี้:

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://www.xyz.com/Services/CommonTypes" elementFormDefault="qualified"
    xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:CommonTypes="http://www.xyz.com/Services/CommonTypes">

 <include schemaLocation=""></include>  
    <complexType name="RequestType">
        <....

หมายเหตุincludeองค์ประกอบที่ว่างเปล่า! นี่คือรากเหง้าของความทุกข์ยากของฉัน ฉันเดาว่านี่เป็นรูปแบบของไฟล์ Egor ที่ไม่พบปัญหาด้านบน

+1 ถึงการรายงานข้อผิดพลาดที่น่าผิดหวัง


4

ในกรณีของฉันการลบแอตทริบิวต์ 'encoding = "UTF-8"' ทั้งหมดนั้นทำงานได้

ดูเหมือนว่าปัญหาการเข้ารหัสชุดอักขระอาจเป็นเพราะไฟล์ของคุณไม่ได้อยู่ใน UTF-8 จริงๆ


4

คำตอบของฉันอาจไม่ช่วยคุณได้ แต่โดยทั่วไปแล้วปัญหานี้จะช่วยได้

เมื่อคุณเห็นข้อยกเว้นประเภทนี้คุณควรพยายามเปิดไฟล์ xml ของคุณใน Hex Editor ใด ๆ และบางครั้งคุณสามารถเห็นไบต์เพิ่มเติมที่จุดเริ่มต้นของไฟล์ที่ตัวแก้ไขข้อความไม่แสดง

ลบพวกเขาและ xml ของคุณจะถูกแยกวิเคราะห์


4

บางครั้งมันเป็นรหัสไม่ใช่ XML

รหัสต่อไปนี้

Document doc = dBuilder.parse(new InputSource(new StringReader("file.xml")));

จะส่งผลให้เกิดข้อผิดพลาดนี้

[ข้อผิดพลาดร้ายแรง]: 1: 1: ไม่อนุญาตเนื้อหาใน prolog.org.xml.sax.SAXParseException; หมายเลขบรรทัด: 1; คอลัมน์จำนวน: 1; เนื้อหาไม่ได้รับอนุญาตในการเปิดฉาก

เพราะมันพยายามแยกสตริงตัวอักษร"file.xml"(ไม่ใช่เนื้อหาของfile.xmlไฟล์) และล้มเหลวเพราะ"file.xml"เป็นสตริงที่มีรูปแบบไม่ถูกต้อง XML

แก้ไข: ลบStringReader():

Document doc = dBuilder.parse(new InputSource("file.xml"));

ในทำนองเดียวกันปัญหาบัฟเฟอร์สกปรกสามารถทิ้งขยะที่เหลือก่อน XML จริง หากคุณตรวจสอบ XML ของคุณอย่างรอบคอบและยังคงได้รับข้อผิดพลาดนี้ให้บันทึกเนื้อหาที่แน่นอนที่ส่งผ่านไปยังตัวแยกวิเคราะห์ บางครั้งสิ่งที่เป็นจริง (พยายามที่จะแยก) น่าแปลกใจ


1
วิธีการแก้ปัญหานี้ได้รับคำแนะนำในเส้นทางที่ถูกต้องในขณะที่ฉันลืมที่จะเพิ่มapplicaionContext.xmlเส้นทางในรหัสและไม่ได้ตรวจสอบในรหัสกำลังมองหาข้อผิดพลาดในไฟล์ XML เท่านั้น
Mrinmoy

3

ล้างโครงการแรกแล้วสร้างโครงการใหม่ ฉันกำลังเผชิญกับปัญหาเดียวกัน ทุกอย่างกลับมาดีหลังจากนี้


2

หากสิ่งอื่นล้มเหลวให้เปิดไฟล์ในไบนารีเพื่อให้แน่ใจว่าไม่มีตัวละครตลก [3 ตัวอักษรที่พิมพ์ไม่ได้ที่จุดเริ่มต้นของไฟล์ที่ระบุไฟล์เป็น utf-8] ที่จุดเริ่มต้นของไฟล์ เราทำสิ่งนี้และพบบางอย่าง ดังนั้นเราจึงแปลงไฟล์จาก utf-8 เป็น ascii และใช้งานได้


2

สำหรับปัญหาเดียวกันฉันได้ลบบรรทัดต่อไปนี้

  File file = new File("c:\\file.xml");
  InputStream inputStream= new FileInputStream(file);
  Reader reader = new InputStreamReader(inputStream,"UTF-8");
  InputSource is = new InputSource(reader);
  is.setEncoding("UTF-8");

มันทำงานได้ดี ไม่แน่ใจว่าทำไม UTF-8 ถึงมีปัญหา เพื่อให้ฉันตกใจก็ใช้งานได้ดีสำหรับ UTF-8 ด้วย

กำลังใช้Windows-7 32 บิตและ Netbeans IDE กับ Java * jdk1.6.0_13 * ไม่รู้เลยว่ามันทำงานยังไง


2

ดังที่ Mike Sokolov ได้ชี้ให้เห็นแล้วสาเหตุหนึ่งที่เป็นไปได้คือการมีตัวอักษร / s บางตัว (เช่นช่องว่าง) หน้าแท็ก

หากอินพุต XML ของคุณกำลังอ่านเป็นสตริง (ตรงข้ามกับอาร์เรย์ไบต์) คุณสามารถใช้แทนที่สตริงอินพุตด้วยโค้ดด้านล่างเพื่อให้แน่ใจว่าอักขระ 'ไม่จำเป็น' ทั้งหมดก่อนที่แท็ก xml จะถูกลบออก

inputXML=inputXML.substring(inputXML.indexOf("<?xml"));

คุณต้องแน่ใจว่า input xml เริ่มต้นด้วยแท็ก xml


2

ในกรณีของฉันweb.xmlในแอปพลิเคชันของฉันมีพื้นที่พิเศษแม้หลังจากที่ฉันลบไม่ทำงานฉันก็ต้องเปลี่ยน chages และแก้ไขและใช่ฉันกำลังเล่นกับlogging.propertiesและweb.xmlใน Tomcat ของฉัน แต่แม้หลังจากที่ฉันเปลี่ยน ข้อผิดพลาดยังคงแสดงอยู่ดังนั้นจึงแก้ไขได้))

พื้นที่เพิ่มเติม

เป็นเฉพาะฉันพยายามจะเพิ่ม org.apache.catalina.filters.ExpiresFilter.level = FINE สแต็คมากกว่าไหลบางสิ่งบางอย่างเกี่ยวกับการ log.properties


1

ฉันทำตามคำแนะนำที่พบที่นี่และฉันได้รับข้อผิดพลาดเดียวกัน

ฉันพยายามแก้ปัญหาหลายอย่าง (เช่นเปลี่ยนการเข้ารหัสพิมพ์ไฟล์ XML แทนที่จะคัดลอกวาง ฯลฯ ) ใน Notepad และ XML Notepad แต่ไม่มีอะไรทำงาน

ปัญหาได้รับการแก้ไขเมื่อฉันแก้ไขและบันทึกไฟล์ XML ใน Notepad ++ (การเข้ารหัส -> utf-8 โดยไม่มี BOM)


1

สำหรับทุกคนที่ได้รับข้อผิดพลาดนี้: คำเตือน: Catalina.start โดยใช้ conf / server.xml: ไม่อนุญาตเนื้อหาใน prolog

ไม่ใช่ข้อมูลมาก .. แต่สิ่งนี้หมายถึงว่ามีขยะในไฟล์ conf / server.xml ของคุณ

ฉันได้เห็นข้อผิดพลาดที่แน่นอนในไฟล์ XML อื่น ๆ .. ข้อผิดพลาดนี้อาจเกิดจากการเปลี่ยนแปลงด้วยโปรแกรมแก้ไขข้อความที่แนะนำขยะ

วิธีที่คุณสามารถตรวจสอบว่าคุณมีขยะในไฟล์หรือไม่คือเปิดด้วย "HEX Editor" หากคุณเห็นตัวละครใด ๆ ก่อนที่จะสตริงนี้

     "<?xml version="1.0" encoding="UTF-8"?>"

แบบนี้คงจะเป็นขยะ

     "‰ŠŒ<?xml version="1.0" encoding="UTF-8"?>"

นั่นคือปัญหาของคุณ .... วิธีแก้ไขคือการใช้ HEX Editor ที่ดี .. สิ่งหนึ่งที่จะช่วยให้คุณสามารถบันทึกไฟล์ด้วยการเข้ารหัสชนิดต่าง ๆ ..

จากนั้นเพียงบันทึกเป็น UTF-8 ระบบบางระบบที่ใช้ไฟล์ XML อาจจำเป็นต้องบันทึกเป็น UTF NO BOM ซึ่งหมายถึงด้วย "NO Byte Order Mark"

หวังว่านี่จะช่วยให้ใครบางคนที่นั่น !!



1

ในการแก้ไขปัญหา BOM ในระบบ Unix / Linux:

  1. ตรวจสอบว่ามีอักขระ BOM ที่ไม่พึงประสงค์หรือไม่: hexdump -C myfile.xml | more อักขระ BOM ที่ไม่ต้องการจะปรากฏที่จุดเริ่มต้นของไฟล์เป็น...<?xml>

  2. file myfile.xmlผลัดกันทำ ไฟล์ที่มีอักขระ BOM จะปรากฏเป็น:myfile.xml: XML 1.0 document text, UTF-8 Unicode (with BOM) text

  3. แก้ไขไฟล์เดียวด้วย: tail -c +4 myfile.xml > temp.xml && mv temp.xml myfile.xml

  4. ทำซ้ำ 1 หรือ 2 เพื่อตรวจสอบไฟล์ว่าผ่านการฆ่าเชื้อแล้ว อาจสมเหตุสมผลที่จะทำview myfile.xmlเพื่อตรวจสอบเนื้อหาที่มีอยู่

ต่อไปนี้เป็นสคริปต์ทุบตีในการฆ่าเชื้อไฟล์ทั้งโฟลเดอร์ของ XML:

#!/usr/bin/env bash

# This script is to sanitise XML files to remove any BOM characters

has_bom() { head -c3 "$1" | LC_ALL=C grep -qe '\xef\xbb\xbf'; }

for filename in *.xml ; do
  if has_bom ${filename}; then
    tail -c +4 ${filename} > temp.xml
    mv temp.xml ${filename}
  fi
done

0

แค่คิดเพิ่มเติมเกี่ยวกับสิ่งนี้สำหรับอนาคต รับข้อผิดพลาดนี้อาจเป็นกรณีที่หนึ่งเพียงกดปุ่มลบหรือปุ่มอื่น ๆ แบบสุ่มเมื่อพวกเขามีหน้าต่าง XML เป็นจอแสดงผลที่ใช้งานอยู่และไม่ได้ให้ความสนใจ สิ่งนี้เกิดขึ้นกับฉันก่อนหน้านี้ด้วยไฟล์ struts.xml ในเว็บแอปพลิเคชันของฉัน ข้อศอกงุ่มง่าม ...


ฉันแน่ใจว่าฉันไม่ได้กดปุ่มใด ๆ
Mad-D

0

ฉันยังได้รับเหมือนกัน

XML reader error: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,2] Message: Reference is not allowed in prolog.

เมื่อแอปพลิเคชันของฉันสร้างการตอบสนอง XML สำหรับการโทร RestFull Webservice ในขณะที่สร้างสตริงรูปแบบ XML ฉันแทนที่ & lt และ & gt ด้วย <และ> จากนั้นข้อผิดพลาดก็ดับลงและฉันก็ได้รับการตอบสนองที่เหมาะสม ไม่แน่ใจว่ามันใช้งานได้ดี แต่ใช้งานได้

ตัวอย่าง :

String body = "<ns:addNumbersResponse xmlns:ns=\"http://java.duke.org\"><ns:return>"
            +sum
            +"</ns:return></ns:addNumbersResponse>";

0

ฉันมีปัญหาเดียวกัน

ก่อนอื่นฉันดาวน์โหลดไฟล์ XML ไปยังเดสก์ท็อปท้องถิ่นและฉันได้รับ Content is not allowed in prologระหว่างการนำเข้าไฟล์ไปยังพอร์ทัลเซิร์ฟเวอร์ แม้ไฟล์ภาพจะดูดีสำหรับฉัน แต่อย่างใดมันก็เสียหาย

ดังนั้นฉันจึงดาวน์โหลดไฟล์เดิมอีกครั้งและลองเหมือนกันและใช้งานได้


0

เรามีปัญหาเดียวกันเมื่อเร็ว ๆ นี้และกลายเป็นกรณีของ URL ที่ไม่ดีและดังนั้นการตอบสนอง HTTP 403 มาตรฐาน (ซึ่งเห็นได้ชัดว่าไม่ใช่ XML ที่ถูกต้องที่ลูกค้าต้องการ) ฉันจะแบ่งปันรายละเอียดในกรณีที่บางคนในบริบทเดียวกันพบกับปัญหานี้:

นี่เป็นเว็บแอปพลิเคชันที่ใช้ Spring ซึ่งมี "JaxWsPortProxyFactoryBean" bean ถูกกำหนดค่าให้แสดงพรอกซีสำหรับพอร์ตระยะไกล

<bean id="ourPortJaxProxyService"
    class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean"
    p:serviceInterface="com.amir.OurServiceSoapPortWs"
    p:wsdlDocumentUrl="${END_POINT_BASE_URL}/OurService?wsdl"
    p:namespaceUri="http://amir.com/jaxws" p:serviceName="OurService"
    p:portName="OurSoapPort" />

"END_POINT_BASE_URL" เป็นตัวแปรสภาพแวดล้อมที่กำหนดค่าใน "setenv.sh" ของอินสแตนซ์ Tomcat ที่โฮสต์เว็บแอปพลิเคชัน เนื้อหาของไฟล์เป็นดังนี้:

export END_POINT_BASE_URL="http://localhost:9001/BusinessAppServices"
#export END_POINT_BASE_URL="http://localhost:8765/BusinessAppServices"

ที่ขาดหายไป ";" หลังจากแต่ละบรรทัดทำให้เกิด URL ที่มีรูปแบบไม่ถูกต้องและทำให้การตอบสนองไม่ดี นั่นคือแทนที่จะเป็น "BusinessAppServices / OurService? wsdl" URL จะมี CR อยู่ก่อน "/" "การตรวจสอบ TCP / IP" ค่อนข้างมีประโยชน์ในขณะที่แก้ไขปัญหา


0

ในกรณีของฉันฉันได้รับข้อผิดพลาดนี้เนื่องจาก API ที่ฉันใช้สามารถส่งคืนข้อมูลในรูปแบบ XML หรือในรูปแบบ JSON เมื่อฉันทดสอบโดยใช้เบราว์เซอร์จะมีการตั้งค่าเริ่มต้นเป็นรูปแบบ XML แต่เมื่อฉันเรียกใช้การโทรเดียวกันจากแอปพลิเคชัน Java API จะส่งคืนการตอบสนองที่จัดรูปแบบ JSON ซึ่งทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์


0

แม้ว่าฉันจะต้องเผชิญกับปัญหาที่คล้ายกัน เหตุผลคืออักขระขยะที่จุดเริ่มต้นของไฟล์

การแก้ไข: เพียงแค่เปิดไฟล์ในตัวแก้ไขข้อความ (ทดสอบใน Sublime text) ลบเยื้องใด ๆ ถ้ามีในไฟล์และคัดลอกวางเนื้อหาทั้งหมดของไฟล์ในไฟล์ใหม่และบันทึก แค่นั้นแหละ!. เมื่อฉันเรียกใช้ไฟล์ใหม่มันจะทำงานโดยไม่มีข้อผิดพลาดในการแยกวิเคราะห์


0

ฉันใช้รหัส Dineshkumar และแก้ไขเพื่อตรวจสอบไฟล์ XML ของฉันอย่างถูกต้อง:

import org.apache.log4j.Logger;

public class Myclass{

private static final Logger LOGGER = Logger.getLogger(Myclass.class);

/**
 * Validate XML file against Schemas XSD in pathEsquema directory
 * @param pathEsquema directory that contains XSD Schemas to validate
 * @param pathFileXML XML file to validate
 * @throws BusinessException if it throws any Exception
 */
public static void validarXML(String pathEsquema, String pathFileXML) 
	throws BusinessException{	
	String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
	String nameFileXSD = "file.xsd";
	String MY_SCHEMA1 = pathEsquema+nameFileXSD);
	ParserErrorHandler parserErrorHandler;
	try{
		SchemaFactory schemaFactory = SchemaFactory.newInstance(W3C_XML_SCHEMA);
		
		Source [] source = { 
			new StreamSource(new File(MY_SCHEMA1))
			};
		Schema schemaGrammar = schemaFactory.newSchema(source);

		Validator schemaValidator = schemaGrammar.newValidator();
		schemaValidator.setErrorHandler(
			parserErrorHandler= new ParserErrorHandler());
		
		/** validate xml instance against the grammar. */
		File file = new File(pathFileXML);
		InputStream isS= new FileInputStream(file);
		Reader reader = new InputStreamReader(isS,"UTF-8");
		schemaValidator.validate(new StreamSource(reader));
		
		if(parserErrorHandler.getErrorHandler().isEmpty()&& 
			parserErrorHandler.getFatalErrorHandler().isEmpty()){
			if(!parserErrorHandler.getWarningHandler().isEmpty()){
				LOGGER.info(
				String.format("WARNING validate XML:[%s] Descripcion:[%s]",
					pathFileXML,parserErrorHandler.getWarningHandler()));
			}else{
				LOGGER.info(
				String.format("OK validate  XML:[%s]",
					pathFileXML));
			}
		}else{
			throw new BusinessException(
				String.format("Error validate  XML:[%s], FatalError:[%s], Error:[%s]",
				pathFileXML,
				parserErrorHandler.getFatalErrorHandler(),
				parserErrorHandler.getErrorHandler()));
		}		
	}
	catch(SAXParseException e){
		throw new BusinessException(String.format("Error validate XML:[%s], SAXParseException:[%s]",
			pathFileXML,e.getMessage()),e);
	}
	catch (SAXException e){
		throw new BusinessException(String.format("Error validate XML:[%s], SAXException:[%s]",
			pathFileXML,e.getMessage()),e);
	}
	catch (IOException e) {
		throw new BusinessException(String.format("Error validate XML:[%s], 
			IOException:[%s]",pathFileXML,e.getMessage()),e);
	}
	
}

}



0

ฉันมีปัญหาเดียวกันกับฤดูใบไม้ผลิ

MarshallingMessageConverter

และโดยรหัสล่วงหน้า

อาจจะมีใครบางคนอาจต้องการเหตุผล: BytesMessage #readBytes - อ่านไบต์ ..และฉันลืมไปว่าการอ่านเป็นการดำเนินการทิศทางเดียว คุณไม่สามารถอ่านสองครั้ง


0

ลองกับ BOMInputStream ใน apache.commons.io:

public static <T> T getContent(Class<T> instance, SchemaType schemaType, InputStream stream) throws JAXBException, SAXException, IOException {

    JAXBContext context = JAXBContext.newInstance(instance);
    Unmarshaller unmarshaller = context.createUnmarshaller();
    Reader reader = new InputStreamReader(new BOMInputStream(stream), "UTF-8");

    JAXBElement<T> entry = unmarshaller.unmarshal(new StreamSource(reader), instance);

    return entry.getValue();
}

0

ฉันมีปัญหาเดียวกันขณะแยกวิเคราะห์info.plistไฟล์ใน mac ของฉัน อย่างไรก็ตามปัญหาได้รับการแก้ไขโดยใช้คำสั่งต่อไปนี้ซึ่งเปลี่ยนไฟล์เป็น XML

plutil -convert xml1 info.plist

หวังว่าจะช่วยใครซักคน


0

ฉันมีปัญหาเดียวกันกับไฟล์ XML บางไฟล์ฉันแก้ไขการอ่านไฟล์ด้วยการเข้ารหัส ANSI (Windows-1252) และเขียนไฟล์ด้วยการเข้ารหัส UTF-8 ด้วยสคริปต์ขนาดเล็กใน Python ฉันลองใช้ Notepad ++ แต่ไม่ประสบความสำเร็จ:

import os
import sys

path = os.path.dirname(__file__)

file_name = 'my_input_file.xml'

if __name__ == "__main__":
    with open(os.path.join(path, './' + file_name), 'r', encoding='cp1252') as f1:
        lines = f1.read()
        f2 = open(os.path.join(path, './' + 'my_output_file.xml'), 'w', encoding='utf-8')
        f2.write(lines)
        f2.close()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.