JAXB unmarshaller игнорирует определенные вложенные теги - PullRequest
2 голосов
/ 10 мая 2019

В приведенном ниже примере я хочу, чтобы имя было напечатано как «mynameabcd123».Как я могу игнорировать теги <b> и </b>?

try {
    JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

    StringReader reader = new StringReader("<customer id=\"100\"><age>29</age> <name>myname<b>abcd</b>123</name></customer>");
    Customer customer1 = (Customer) unmarshaller.unmarshal(reader);

    System.out.println(customer1.getName());
} 
catch (JAXBException e) {
    e.printStackTrace();
}

Класс клиента

@XmlRootElement
public class Customer {
    String name;
    int age;
    int id;

    public String getName() {
        return name;
    }

    @XmlElement
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    @XmlElement
    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    @XmlAttribute
    public void setId(int id) {
        this.id = id;
    }
}

1 Ответ

2 голосов
/ 12 мая 2019

Вы можете реализовать свой собственный XmlAdapter, который будет правильно преобразовывать узлы с внутренними тегами в строку.Ваша реализация должна быть легкой - повторяющаяся String конкатенация всех дочерних узлов.Для регистрации адаптеров используйте аннотацию @XmlJavaTypeAdapter.

Ниже вы можете найти пример, который делает это:

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.io.StringReader;

public class JaxbApp {

    public static void main(String[] args) throws Exception {
        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

        StringReader reader = new StringReader("<customer id=\"100\"><age>29</age> <name>myname<b>abcd</b>123</name></customer>");
        Customer customer1 = (Customer) unmarshaller.unmarshal(reader);

        System.out.println(customer1);
    }
}

class TrimHtmlXmlAdapter extends XmlAdapter<Object, String> {

    @Override
    public String unmarshal(Object v) {
        Node node = (Node) v;
        StringBuilder builder = new StringBuilder();
        getNodeValueToString(node, builder);

        return builder.toString();
    }

    private void getNodeValueToString(Node node, StringBuilder builder) {
        if (node == null) {
            return;
        }
        final String value = node.getNodeValue();
        if (value != null) {
            builder.append(value);
        }

        final NodeList childNodes = node.getChildNodes();
        final int size = childNodes.getLength();
        for (int i = 0; i < size; i++) {
            getNodeValueToString(childNodes.item(i), builder);
        }
    }

    @Override
    public Object marshal(String v) {
        return null;
    }
}


@XmlRootElement
class Customer {
    String name;
    int age;
    int id;

    public String getName() {
        return name;
    }

    @XmlElement
    @XmlJavaTypeAdapter(TrimHtmlXmlAdapter.class)
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    @XmlElement
    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    @XmlAttribute
    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", id=" + id +
                '}';
    }
}

Надпечатки кода выше:

Customer{name='mynameabcd123', age=29, id=100}
...