org.xml.sax.SAXParseException; Преждевременный конец файла при попытке получить ввод XML из запроса

#java #xml #httprequest

#java #xml #httprequest

Вопрос:

Я пытаюсь проанализировать большой xml из запроса, используя следующий код:

 String eD = IOUtils.toString(request.getReader());
DocumentBuilder db = null;
    try {
        db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    } catch (ParserConfigurationException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    InputSource is = new InputSource();
    is.setCharacterStream(new StringReader(eD));
    
    Document doc = null;
    try {
        doc = db.parse(is);
    } catch (SAXException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
 

Я получаю следующую ошибку в строке where doc = db.parse(is); is. Я проверил eD строку первой строки кода и она пуста. Как я могу получить ввод из HttpServletRequest?

 [Fatal Error] :1:1: Premature end of file.
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Premature end of file.
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
 

Когда я пытаюсь распечатать eD, я получаю пустую строку.

Снимок входных данных xml:

  <ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:epsos="urn:epsos-org:ep:medication" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <typeId extension="POCD_HD000040" root="2.16.840.1.113883.1.3"/>
    <templateId root="1.3.6.1.4.1.12559.11.10.1.3.1.1.2"/>
    <templateId root="1.3.6.1.4.1.19376.1.5.3.1.1.1"/>
    <id extension="5LMLbecMdsVlpoSA" root="2.16.840.1.113883.2.25.3.4.1.4.1"/>
    <code code="60593-1" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" codeSystemVersion="2.59" displayName="Medication dispensed.extended Document">
        <translation code="60593-1" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="eDispensation"/>
    </code>
<title>Medication dispensed</title>
<effectiveTime value="20201109112323 0200"/>
<confidentialityCode code="N" codeSystem="2.16.840.1.113883.5.25" codeSystemName="Confidentiality" codeSystemVersion="913-20091020" displayName="normal"/>
<languageCode code="el-GR"/>
<setId nullFlavor="NI"/>
<recordTarget>
    <patientRole>
        <id extension="1990-01-01_1" root="2.16.17.710.860.1000.990.1"/>
        <addr>
            <country>CY</country>
            <streetAddressLine>21, Dimokritou, 1000, Strovolos, Nicosia</streetAddressLine>
        </addr>
        <telecom use="H" value="tel: 99000000"/>
        <telecom use="H" value="mailto:l.petr@testmail.com"/>
        <patient>
            <name>
                <given>Leonidas</given>
                <family>Petrou</family>
            </name>
            <administrativeGenderCode code="M" codeSystem="2.16.840.1.113883.5.1" codeSystemName="AdministrativeGender" codeSystemVersion="913-20091020" displayName="Male"/>
            <birthTime value="19900101"/>
            <languageCommunication>
                <templateId root="1.3.6.1.4.1.19376.1.5.3.1.2.1"/>
                <languageCode code="en-GB"/>
            </languageCommunication>
        </patient>
    </patientRole>
</recordTarget>
<author typeCode="AUT">
    <functionCode code="2262" codeSystem="2.16.840.1.113883.2.9.6.2.7" codeSystemName="ISCO" codeSystemVersion="2008" displayName="Pharmacists"/>
    <time value="20201109112323 0200"/>
    
</author>
<inFulfillmentOf>
    <order moodCode="RQO">
        <id extension="ePid.1006.1.cda" root="2.16.196.1.101.10.3.29.54290"/>
    </order>
</inFulfillmentOf>
<relatedDocument typeCode="APND">
    <parentDocument classCode="DOCCLIN">
        <id extension="ePid.1006.1.cda" root="2.16.196.1.101.10.3.29.54290"/>
    </parentDocument>
</relatedDocument>
<component>
    <structuredBody>
        <component>
            <section>
                <templateId root="2.16.840.1.113883.10.20.1.8"/>
                <templateId root="1.3.6.1.4.1.12559.11.10.1.3.1.2.2"/>
                <id extension="D-ePid.1006.1.cda" root="2.16.840.1.113883.2.25.3.4.1.4.1"/>
                <code code="60590-7" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" codeSystemVersion="2.59" displayName="Medication dispensed.brief Document">
                    <translation code="60590-7" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Medication dispensed"/>
                </code>
                <title>Dispensation: D-ePid.1006.1.cda</title>
                <text>
                    <table width="100%">
                        <thead>
                            <tr>
                                <th>Active Ingredient (ATC)</th>
                                <th>Pharmaceutical Dose Form</th>
                                <th>Strength</th>
                                <th>Number of Units per intake</th>
                                <th>Frequency of Intake</th>
                                <th>Duration of treatment</th>
                                <th>Number of Prescribed Packages</th>
                                <th>Size of the package prescribed and package type</th>
                                <th>Route of Administration</th>
                                <th>Substitution</th>
                                <th>Onset Date of treatment</th>
                                <th>Instructions to patient</th>
                                <th>Advise to the dispenser</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr ID="medicine.1">
                                <td>teriparatide (ATC: H05AA02)</td>
                                <td>Solution for injection</td>
                                <td>20 ug</td>
                                <td>1</td>
                                <td>1 per day</td>
                                <td>60 days</td>
                                <td>1</td>
                                <td>2 x 28 ug , Pre-filled pen</td>
                                <td>Subcutaneous use</td>
                                <td>Generic</td>
                                <td>2020-11-02</td>
                                <td>NA</td>
                                <td>NA</td>
                            </tr>
                        </tbody>
                    </table>
                </text>
            </section>
        </component>
    </structuredBody>
</component>
</ClinicalDocument>
 

Ответ №1:

Из :1:1: маркера позиции в выводе ошибки вы проанализировали пустую строку.

Ваш документ заканчивается на первом символе первой строки, который, вероятно end of file , является имитируемым сигналом, который отмечает, что ввод больше не доступен.

Проблема заключается не в этом коде, а в коде, который помещает символы в eD строку.

Поскольку request.getReader() заполнено eD , скорее всего, у вас возникли проблемы с вашим запросом. Либо он вернул a 404 , либо веб-сервер вернул 300 перенаправление серии, либо какая-то другая проблема (при условии, что это HTTP), которая обычно имеет пустое тело.

Проверьте код возврата вашего запроса, прежде чем извлекать содержимое его тела. Он расскажет вам, что вам нужно знать, чтобы найти правильные ответы, чтобы исправить это.

Комментарии:

1. Спасибо! Запрос возвращает 500.

2. @zinon Похоже, вам нужно исправить конфигурацию веб-сервера. серия 500 предназначена для «внутренней ошибки сервера».

3. Конечная точка получает доступ к моему коду, потому что у меня есть отладка. Однако я получаю пустую строку в качестве входных данных.

4. Может IOUtils.toString() быть, возникает вопрос?

5. @zinon Коды состояния HTTP-ответа упорядочены по первой цифре. Вся серия 500 предназначена для ошибок, возникающих на веб-сервере. Вы ничего не можете сделать со своим кодом, чтобы исправить значение 500, и ваш код мало что может сделать для его создания. Единственное, что может сделать ваш код, — это, возможно, выполнить другой вызов. developer.mozilla.org/en-US/docs/Web/HTTP/Status