Как удалить дополнительный escape-символ при выполнении маршлинга с помощью jaxb

#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?