Jaxb unmarshal xml, который содержит знаки & <> - PullRequest
6 голосов
/ 15 апреля 2019

Чтобы проанализировать мой XML с помощью JAXB, я уже сгенерировал требуемые POJO и успешно смог проанализировать XML. Но всякий раз, когда мой xml содержит '&' '<>' знаков, он терпит неудачу. Согласно правилу это должно быть изменено на '&amp', но 3PP, генерирующий XML, не следует правилу. Теперь, как я могу разобрать этот xml с '& <>' знаками.

Примечание - Для Marshalling я нашел много ответов, но не работал на unmarshalling.

Среда - Java 8

Пример XML:

<Customer Info> This is & Customer Info <Customer Info>

Любая помощь будет полезна

Ответы [ 3 ]

1 голос
/ 22 апреля 2019

JSoup предназначен для обработки довольно грубого и готового HTML, поэтому работает с более щедрыми правилами синтаксического анализа, чем обычный XML API (например, встроенная версия Xerces, поставляемая с JRE).

Может выводить XML в DOM W3C, пригодный для использования в JAXB:

    org.jsoup.nodes.Document soupDoc = Jsoup.parse(unescapedXml, "",
            Parser.xmlParser());
    org.w3c.dom.Document w3cDoc = new W3CDom().fromJsoup(soupDoc);

    JAXBContext jaxbContext = JAXBContext.newInstance(CustInfo.class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    CustInfo custInfo = (CustInfo) jaxbUnmarshaller.unmarshal(w3cDoc);

(досадно, что JSoup и W3C используют Document).

Похоже, что это хорошо справляется с любым из '&' '<' или '>' в атрибуте XML или в тексте, хотя есть определенные комбинации, в которых нехватка escape-символов слишком велика.

0 голосов
/ 27 апреля 2019

Вам нужно будет передать строку XML через StringEscapeUtils.escapeXml();

Из документации

Поддерживает только пять основных сущностей XML (gt, lt, quot, amp, apos). Не поддерживает DTD или внешние объекты.

Обратите внимание, что символы Юникода больше 0x7f в настоящее время экранированы к их числовому эквиваленту. Это может измениться в будущих выпусках.

0 голосов
/ 26 апреля 2019

Есть ряд платформ с открытым исходным кодом, которые помогают, Джексон является одним из наиболее популярных.Как разработчик, если я не создаю новый сторонний сериализатор и десериализатор, я бы оставил задачу парсинга на утилиту.

Проверьте класс XMLMapper в Джексоне для сериализации и десериализации.См. Методы writeValue () и readValue () для записи в XML и чтения из XML соответственно.

...