2014-09-12 103 views
0

我正在使用JAXB将字符串xml数据转换为POJO,如下所示。强制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 2014-09-12 15:35:52

+0

我不能这样做,因为我需要保持原样的数据。 – 2014-09-12 15:44:31

+0

“有时它们也是错误的” - 但是您的XML有效吗?如果不是,您可能需要先使用诸如JTidy之类的东西。 – lexicore 2014-09-12 18:05:01

回答

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。它的工作和帮助我。但对我而言,这个问题有点不同。 – 2014-09-15 14:06:19