java - 强制 jaxb 解码器忽略 html 标签

标签 java xml parsing jaxb unmarshalling

我正在使用 JAXB 将字符串 xml 数据转换为 POJO,如下所示。

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

一切顺利,但在解码期间它总是尝试验证每个元素的文本,有时会失败。我不希望这样,因为文本中有很多 html 标签,有时它们也是错误的。

因此,我希望 JAXB 跳过整个文本并按原样传递它以形成 POJO 数据。有什么办法可以实现这一点吗?任何帮助将不胜感激。

最佳答案

这里是一个例子,你需要使用@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();
      }

    }
}

按原样打印内容:

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

希望有帮助。

关于java - 强制 jaxb 解码器忽略 html 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25811351/

相关文章:

java - 在 Java 中将监听器变成 future

ruby - 如何在有前缀但没有 namespace 的节点上使用 xpath?

parsing - 如何将此 API 调用(在 R 中)解析为 .txt 表格式? (与以色列:) )的 "open government"相关

ruby - 为什么 "23 Dogs"在 pry 中被解析为 2015 年 11 月 23 日,但 "3 Dogs"给出解析器错误?

java - JUnit测试编译

java - 如何使用在 Android studio 中自动创建的内部静态 Placeholder Fragment 类?

java - JCombobox 改变另一个 JCombobox

android - DataBinding Binder 不适用于具有不同限定符的 2 个相同布局

javascript - GAE channel api解析onmessage

java - 将 JSON 文件解析为 Java 对象