SXXP0003: Ошибка синтаксического анализатора XML: содержание не разрешено в прологе - PullRequest
1 голос
/ 22 февраля 2010

Мой XML-файл

<?xml version="1.0" encoding="ISO-8859-1"?>
<T0020
    xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.safersys.org/namespaces/T0020V1">
    <INTERFACE>
        <NAME>SAFER</NAME>
        <VERSION>04.02</VERSION>
    </INTERFACE>
    <TRANSACTION>
        <VERSION>01.00</VERSION>
        <OPERATION>REPLACE</OPERATION>
        <DATE_TIME>2009-09-01T00:00:00</DATE_TIME>
        <TZ>CT</TZ>
    </TRANSACTION>
    <IRP_ACCOUNT>
        <IRP_CARRIER_ID_NUMBER>564182</IRP_CARRIER_ID_NUMBER>
        <IRP_BASE_COUNTRY>US</IRP_BASE_COUNTRY>
        <IRP_BASE_STATE>AR</IRP_BASE_STATE>
        <IRP_ACCOUNT_NUMBER>67432</IRP_ACCOUNT_NUMBER>
        <IRP_ACCOUNT_TYPE>I</IRP_ACCOUNT_TYPE>
        <IRP_STATUS_CODE>100</IRP_STATUS_CODE>
        <IRP_STATUS_DATE>2008-02-01</IRP_STATUS_DATE>
        <IRP_UPDATE_DATE>2009-06-18</IRP_UPDATE_DATE>
        <IRP_NAME>
            <NAME_TYPE>LG</NAME_TYPE>
            <NAME>LARRY SHADDON</NAME>
            <IRP_ADDRESS>
                <ADDRESS_TYPE>PH</ADDRESS_TYPE>
                <STREET_LINE_1>10291 HWY 124</STREET_LINE_1>
                <STREET_LINE_2/>
                <CITY>RUSSELLVILLE</CITY>
                <STATE>AR</STATE>
                <ZIP_CODE>72802</ZIP_CODE>
                <COUNTY>POPE</COUNTY>
                <COLONIA/>
                <COUNTRY>US</COUNTRY>
            </IRP_ADDRESS>
            <IRP_ADDRESS>
                <ADDRESS_TYPE>MA</ADDRESS_TYPE>
                <STREET_LINE_1>10291 HWY124</STREET_LINE_1>
                <STREET_LINE_2/>
                <CITY>RUSSELLVILLE</CITY>
                <STATE>AR</STATE>
                <ZIP_CODE>72802</ZIP_CODE>
                <COUNTY>POPE</COUNTY>
                <COLONIA/>
                <COUNTRY>US</COUNTRY>
            </IRP_ADDRESS>
        </IRP_NAME>
    </IRP_ACCOUNT>
</T0020>

Я использую следующий XSLT для разделения моего xml-файла на несколько xml-файлов.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:t="http://www.safersys.org/namespaces/T0020V1" version="2.0">
 <xsl:output method="xml" indent="yes" name="xml" /> 
 <xsl:variable name="accounts" select="t:T0020/t:IRP_ACCOUNT" /> 
 <xsl:variable name="size" select="30" />
 <xsl:template match="/">
  <xsl:for-each select="$accounts[position() mod $size = 1]">
   <xsl:variable name="filename" select="resolve-uri(concat('output/',position(),'.xml'))" /> 
    <xsl:result-document href="{$filename}" method="xml">
     <T0020>
      <xsl:for-each select=". | following-sibling::t:IRP_ACCOUNT[position() &lt; $size]">
         <xsl:copy-of select="." /> 
        </xsl:for-each>      
     </T0020>
    </xsl:result-document>    
  </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

Это хорошо работает в Примере Java, но когда я пытался использовать его в приложении на базе Spring, выдает следующую ошибку.

Error on line 1 column 1 of T0020:
  SXXP0003: Error reported by XML parser: Content is not allowed in prolog.

Я не знаю, что пошло не так? Пожалуйста, помогите мне. Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 12 октября 2011

Ваш XML начинается с метки порядка байтов в UTF-8 (0xEF, 0xBB, 0xBF), которая не отображается. Попробуйте открыть файл с помощью шестнадцатеричного редактора и посмотрите.

Многие текстовые редакторы под Windows любят вставлять это в начале текста в кодировке UTF-8, несмотря на то, что UTF-8 на самом деле не требуется метка порядка байтов, поскольку порядок байтов UTF-8 уже четко определен.

Все синтаксические анализаторы Java будут задыхаться от спецификации точно с сообщением об ошибке, которое вы видите. Вам нужно будет либо удалить BOM, либо написать оболочку для вашего InputStream, которую вы передаете анализатору XML, чтобы сделать это для вас во время синтаксического анализа.

1 голос
/ 22 февраля 2010

В документе есть какой-то контент до начала XML-данных, вероятно, пробел в предположении (вот где я видел это раньше).

Пролог - это часть документа, которая находится перед открывающим тегом, с тегоподобными конструкциями вроде <? и <! Между этими тегами могут быть некоторые символы / пробелы. Прологи и действительный контент описаны на tiztag.com .

Может быть, опубликовать обезличенный пример ваших данных XML?

0 голосов
/ 03 октября 2018

В моем случае encoding="UTF-16" вызывал эту проблему. Это было решено, когда я изменил его на UTF-8.

0 голосов
/ 22 февраля 2010

Это также возможно получить, если вы попытаетесь обработать содержимое дважды. (Это довольно легко сделать весной.) В этом случае не будет ничего плохого в вашем XML. Этот сценарий кажется вероятным, поскольку пример приложения работает, но введение Spring вызывает проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...