Добавление метода получения запрещает синтаксический анализ, когда значение начинается с цифры - PullRequest
0 голосов
/ 12 июля 2020

Я хочу демаршалировать xml содержимое следующим образом:

JAXBContext context = JAXBContext.newInstance(Node.class);
        
String input = "<item><d>foo</d></item>";
StreamSource istream = new StreamSource(new StringReader(input));
JAXBElement<Node> node = context.createUnmarshaller().unmarshal(istream, Node.class);
System.out.println(node.getValue().toString());

Элемент d нельзя тривиально преобразовать в желаемый объект, здесь логическое , поэтому я использую метод установки для этого.

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "item")
public class Node {

    @XmlElement(name = "d") 
    private Boolean value;

    public void setValue(String d) {
        this.value = d.equals("") ? Boolean.TRUE : Boolean.FALSE;
    }
        
    @Override
    public String toString() {
        
        return value.toString();
    }
}

XmlAnnotaion также может быть setValue, однако, когда я добавляю метод получения, он должен быть в поле (в противном случае нет синтаксического анализа и value остается null).

public Boolean getValue() {return value;}

Но если вместо foo значение начинается с di git или специального символа, скажем ?, синтаксический анализ снова отсутствует.

Сводка эффектов:

аннотация в поле + без геттера -> анализирует foo аннотация в сеттере + без геттера -> анализирует foo и 0foo аннотация в поле + геттер -> анализирует foo аннотация в сеттере + получателе -> не анализирует ни

Как мне нужно установить аннотации, чтобы я мог анализировать произвольные значения в d, и почему это работает здесь для строк, начинающихся с буквы?

1 Ответ

0 голосов
/ 13 июля 2020

Потому что XML - это типизированный язык, и типы получателя и сеттера должны совпадать.

Если. это похоже на реальную вещь, за которую вам платят, тогда вам нужно go и потратить некоторое время на чтение документации jaxb и, возможно, xml документации схемы .

вот какой-то код, почему бы и нет.

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "item")
public class Node {

    private Boolean value;

    @XmlElement(name = "d", nillable = true, required = false)
    public void setValue(String d) {
        this.value = "".equals(d) ? Boolean.TRUE : Boolean.FALSE;
    }

    public String getValue(String d) {
        return String.valueOf(value);
    }

    public boolean isValue() {
        return Boolean.TRUE.equals(value);
    }

    @Override
    public String toString() {
        return "[Node|value=" + value + "]";
    }

    public static void main(String... args) {
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(Node.class);
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            Node node = (Node) jaxbUnmarshaller.unmarshal(new StringReader("<item><b></b></item>"));
            System.out.println(node);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...