Неустранимая ошибка: ссылка на символ "& # org.xml.sax.SAXParseException; - PullRequest
1 голос
/ 25 марта 2019

Есть

 <BATCHNAME>&#4; Any</BATCHNAME> 

тег в моем xml-запросе, имеющий значение '' символов. Без этих символов мой код работает отлично, но в некоторых случаях у меня есть эти символы. Это дает мне следующую ошибку

[Фатальная ошибка]: 144: 28: ссылка на символ "& # org.xml.sax.SAXParseException; номер строки: 144; номер столбца: 28; символ ссылка "& # at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse (DOMParser.java:257) в com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse (DocumentBuilderImpl.java:339) в javax.xml.parsers.DocumentBuilder.parse (DocumentBuilder.java:121) в d.b (AllCommonTasks.java:277) в ...

Мне нужны эти символы для проверки

Я пытаюсь этот код =>

try {                      

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();

        URLConnection urlConnection = new URL(urlString).openConnection();
        urlConnection.addRequestProperty("Accept", "application/xml");
        urlConnection.addRequestProperty("User-Agent", "Mozilla/5.0 ( compatible ) ");
        Document doc = db.parse(urlConnection.getInputStream());
        doc.getDocumentElement().normalize();

        str = convertDocumentToString(doc);


    }catch(Exception e){
        System.err.println("In exception 1");
        e.printStackTrace();
    }

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 25 марта 2019

Если посмотреть на страницу Википедии для ссылок на сущности XML и HTML , ссылки на сущности, следующие за шаблоном &#nnnn;, представляют собой кодовые точки Unicode в десятичной форме, что означает, что &#4; будет эквивалентно Unicode U + 0004 : END OF TRANSMISSION, что является непечатаемым символом.

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

На самом деле, если вы посмотрите на источник com.sun.org.apache.xerces.internal.impl.XMLScanner#scanCharReferenceValue, вы увидите, что он ссылается на com.sun.org.apache.xerces.internal.util.XMLChar#isValid здесь:

/**
 * Returns true if the specified character is valid. This method
 * also checks the surrogate character range from 0x10000 to 0x10FFFF.
 * <p>
 * If the program chooses to apply the mask directly to the
 * <code>CHARS</code> array, then they are responsible for checking
 * the surrogate character range.
 *
 * @param c The character to check.
 */
public static boolean isValid(int c) {
    return (c < 0x10000 && (CHARS[c] & MASK_VALID) != 0) ||
           (0x10000 <= c && c <= 0x10FFFF);
} // isValid(int):boolean
...