2014-09-12 2 views
0

Я использую JAXB для преобразования данных xml в POJO следующим образом.Force jaxb unmarshaller игнорировать html Теги

JAXBContext jaxbContext = JAXBContext.newInstance(Employee.class); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
StringReader reader = new StringReader(temp); 
Employee emp = (Employee) unmarshaller.unmarshal(reader); 

Все идет хорошо, но оно всегда пытается проверить текст каждого элемента во время немаршала, а иногда и не получилось. Этого я не хочу, потому что в тексте много html-тегов, и иногда они ошибочны.

Итак, я хочу, чтобы JAXB пропустил весь текст и передал его, чтобы сформировать POJO-данные. Есть ли способ достичь этого. Любая помощь будет оценена.

+0

Вы пробовали обернуть содержимое элемента в 'CDATA'? – user3487063

+0

Я не могу этого сделать, потому что мне нужно поддерживать данные так, как есть. –

+0

«Иногда они ошибочные тоже» - но является ли ваш XML действительным? Если нет, вам может понадобиться сначала использовать что-то вроде JTidy. – lexicore

ответ

2

Вот пример, вам нужно использовать @XmlAnyElement, чтобы получить контент как есть, не используя CDATA.

Employee.java:

import javax.xml.bind.annotation.XmlAnyElement; 
import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Employee { 
private long id; 
private String name; 
private int age; 
public long getId() { 
    return id; 
} 
@XmlAttribute 
public void setId(long id) { 
    this.id = id; 
} 
@Override 
public String toString() { 
    return "Employee [id=" + id + ", name=" + name + ", age=" + age + "]"; 
} 
public String getName() { 
    return name; 
} 
@XmlAnyElement(NameHandler.class) 
public void setName(String name) { 
    this.name = name; 
} 
public int getAge() { 
    return age; 
} 
@XmlElement 
public void setAge(int age) { 
    this.age = age; 
} 
} 

NameHandler.java:

import java.io.StringReader; 
import java.io.StringWriter; 

import javax.xml.bind.ValidationEventHandler; 
import javax.xml.bind.annotation.DomHandler; 
import javax.xml.transform.Source; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 

public class NameHandler implements DomHandler<String, StreamResult> { 

     private static final String NAME_START_TAG = "<name>"; 
     private static final String NAME_END_TAG = "</name>"; 

     private StringWriter xmlWriter = new StringWriter(); 
    @Override 
    public StreamResult createUnmarshaller(ValidationEventHandler errorHandler) { 
     return new StreamResult(xmlWriter); 
    } 

    @Override 
    public String getElement(StreamResult rt) { 
     String xml = rt.getWriter().toString(); 
      int beginIndex = xml.indexOf(NAME_START_TAG) + NAME_START_TAG.length(); 
      int endIndex = xml.indexOf(NAME_END_TAG); 
      return xml.substring(beginIndex, endIndex); 
    } 

    @Override 
    public Source marshal(String n, ValidationEventHandler errorHandler) { 
     try { 
       String xml = NAME_START_TAG + n.trim() + NAME_END_TAG; 
       StringReader xmlReader = new StringReader(xml); 
       return new StreamSource(xmlReader); 
      } catch(Exception e) { 
       throw new RuntimeException(e); 
      } 
    } 

} 

JAXB:

import java.io.StringReader; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 

public class JAXBExample { 
    public static void main(String[] args) { 

    try { 
String temp ="<employee id=\"1001\"><age>25</age><name>myemp<p>content inside tags</p></name></employee>"; 
     JAXBContext jaxbContext = JAXBContext.newInstance(Employee.class); 
StringReader reader = new StringReader(temp); 
     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
     Employee emp = (Employee) jaxbUnmarshaller.unmarshal(reader); 
     System.out.println(emp); 

     } catch (JAXBException e) { 
     e.printStackTrace(); 
     } 

    } 
} 

печатает conten t, как есть:

Employee [id=1001, name=myemp<p>content inside tags</p>, age=25] 

Надеюсь, это поможет.

+0

Спасибо user3487063. Это работает и помогло мне. Но для меня проблема была немного иной. –

Смежные вопросы