#java #xml #jaxb
Вопрос:
Исходный XML amp; добавлен JAXB, который необходимо игнорировать :-
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<emp>
<address>7 stret amp;amp; new </address>
<name>Naveenqq</name>
</emp>
ожидается без усилителя(требуется фактическое значение) :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<emp>
<address>7 stret amp; new </address>
<name>Naveenqq</name>
</emp>
Я попробовал приведенный ниже код:
private static void jaxbObjectToXML(Emp employee) throws IOException, SAXException, ParserConfigurationException
{
try
{
JAXBContext jaxbContext = JAXBContext.newInstance(Emp.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
//jaxbMarshaller.setProperty("jaxb.encoding", "US-ASCII");
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
//jaxbMarshaller.setProperty(OutputKeys.ENCODING, "ASCII");
//jaxbMarshaller.setProperty(CharacterEscapeHandler.class.getName(), new CustomCharacterEscapeHandler());
// jaxbMarshaller.setProperty(CharacterEscapeHandler.class.getName(), new CharacterEscapeHandler() {
//
// @Override
// public void escape(char[] ch, int start, int length, boolean isAttVal, Writer out) throws IOException {
// out.write( ch, start, length );
//
// }
// });
//
// StringWriter writer = new StringWriter();
File file = new File("employee1.xml");
jaxbMarshaller.marshal(employee, file);
//
// DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// DocumentBuilder builder = factory.newDocumentBuilder();
// InputSource is = new InputSource( new StringReader( writer.toString() ) );
// Document doc = builder.parse( is );
System.out.println("done::");
}
catch (JAXBException e)
{
e.printStackTrace();
}
}
Пожалуйста , помогите, как решить то же самое, я перепробовал все типы кодировки
Ответ №1:
Проблема в том, что amp;
в XML это недопустимо, и если вы попытаетесь проверить XML с amp;
его помощью, это не удастся. JAXB
довольно умный, поэтому он пытается заменить специальные символы их сущностями символов. Аналогичная вещь происходит и в HTML. Вы можете обратиться сюда.
Но если вы наблюдаете значения после JAXB Unmarshalling
того, как он был заменен на amp;
вместо amp;amp;
. Так что вам не нужно беспокоиться о том, что это есть в XML. Я думаю, что если вы пойдете по нужному вам маршруту, это приведет ко многим осложнениям, и сам ваш XML будет недействительным.
XML:
<emp>
<address>7 stret amp;amp; new</address>
<name>Naveenqq</name>
</emp>
Корень:
@Data
@XmlRootElement(name = "emp")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
private String address;
private String name;
}
Главная:
public class Main {
public static void main(String[] args) throws JAXBException, XMLStreamException {
final InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("test.xml");
final XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
final Unmarshaller unmarshaller = JAXBContext.newInstance(Root.class).createUnmarshaller();
final Root root = unmarshaller.unmarshal(xmlStreamReader, Root.class).getValue();
System.out.println(root.toString());
Marshaller marshaller = JAXBContext.newInstance(Root.class).createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "US-ASCII");
//marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", new XmlCharacterHandler());
marshaller.marshal(root, System.out);
}
}
Выход:
Root(address=7 stret amp; new, name=Naveenqq)
<?xml version="1.0" encoding="US-ASCII"?>
<emp>
<address>7 stret amp;amp; new</address>
<name>Naveenqq</name>
</emp>
Как вы можете видеть в выводе Root(address=7 stret amp; new, name=Naveenqq)
, он был заменен, amp;
чтобы вы могли продолжать использовать то же самое.
Надеюсь, это объяснение поможет.
Ответ №2:
Ваше ожидаемое значение не является допустимым XML, поэтому вы никак не сможете убедить какой-либо инструмент, поддерживающий XML, сгенерировать его.
Почему вы пытаетесь сгенерировать недопустимый XML?