#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;