JaxB — значения вложенных элементов равны нулю

#java #xml #xml-parsing #jaxb

#java #xml #xml-синтаксический анализ #джаксб

Вопрос:

Я пытаюсь преобразовать XML в объект с помощью JAXB. Вот мой код

 <Root>
    <RName>jj</RName>
    <RID>55</RID>
    <Source>
        <Code ID="17">
           <Target Name="A" ID="20" StartAt=".01">
           </Target>

        </Code>
    </Source>
</Root>
 
 @XmlRootElement(name = "Root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root { 
    public String RName;
    public int RID;
    public Source Source;
    
    //getter setter
}
 
 @XmlRootElement(name = "Source")
@XmlAccessorType(XmlAccessType.FIELD)
public class Source {
    public Code Code;
    //getter setter
}
 
 @XmlRootElement(name = "Code")
@XmlAccessorType(XmlAccessType.FIELD)
public class Code {
    public Target Target;
    public int ID;

}
 
 @XmlRootElement(name = "Target")
@XmlAccessorType(XmlAccessType.FIELD)
public class Target {
    public String Name;
    public String ID;
    public String StartAt;
    //getter setter

}
 

ДЖАКСБ :

 File xmlFile = new File("Root.xml");
JAXBContext jaxbContext;
try
{
    jaxbContext = JAXBContext.newInstance(Root.class);              
 
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
 
    Root employee = (Root) jaxbUnmarshaller.unmarshal(xmlFile);
     
    System.out.println(employee);
}
catch (JAXBException e) 
{
    e.printStackTrace();
}
 

Я могу получить значения RName, RID, другие значения равны нулю. Где я делаю ошибку ?

Ответ №1:

Для свойств Java ( Name , ID , StartAt ), которые по-прежнему равны нулю после отмены сопоставления, вы пропустили сообщить JAXB, что они соответствуют атрибутам XML (например StartAt="A" ). По умолчанию JAXB предполагает, что они соответствуют элементам XML (например <StartAt>.01</StartAt> ).

Вы можете исправить свой код с помощью @XmlAttribute аннотации. Так, например, вместо

 public String StartAt;
 

вам нужно написать

 @XmlAttribute(name = "StartAt")
public String StartAt;
 

И, кстати: лучше всего начинать свойства Java
со строчной, а не с прописной буквы.
Так что вы могли бы лучше написать

 @XmlAttribute(name = "StartAt")
public String startAt;
 

Вы по-прежнему получаете правильное имя атрибута XML в верхнем регистре (здесь StartAt )
путем указания name="StartAt" в @XmlAttribute аннотации.

То же самое рекомендуется для свойств Java, соответствующих элементам XML, с помощью @XmlElement аннотации. как , например,

 @XmlElement(name = "RName")
public String rName;