У меня есть класс java из схемы xsd с JAXB
. В классе Main у меня есть метод под названием recursiveNodeList(NodeList list)
, который просто берет список узлов и повторяется через него рекурсивно, чтобы получить из него все значения.JAXB: Почему значение возвращает значение null, если я просто устанавливаю это значение и возвращает реальное значение, когда устанавливаю другие значения?
Все работает, кроме одной вещи, которую я не могу просто понять.
В коде ниже я эти две линии:
item.setNote("Notetest1");
item.setTitle("Title1");
Когда я запускаю код я получаю этот выход:
title->#text->Title1
note->#text->Notetest1
Если я просто использовать одну из линий, как:
item.setNote("Notetest1");
// item.setTitle("Title1"); /*commented out*/
я получаю этот выход:
item->note->null
Почему примечание ноль, если я просто установить это значение, а не называть setTitle()
и почему это имеет значение, когда я звоню как setNote
и setTitle?
Код в его целом:
public class JavaXML {
public static void main(String[] args) throws ParserConfigurationException, JAXBException, FileNotFoundException {
Item item = new Item();
JAXBContext jaxb = JAXBContext.newInstance(item.getClass().getPackage().getName());
Marshaller marshaller = jaxb.createMarshaller();
item.setNote("Notetest1");
item.setTitle("Title1");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.newDocument();
marshaller.marshal(item, doc);
NodeList nodeList = doc.getChildNodes();
recursiveNodeList(nodeList);
}
public static void recursiveNodeList(NodeList nodeList) {
for(int i = 0; i< nodeList.getLength(); i++) {
Node fstNode = nodeList.item(i);
if (fstNode.getNodeType() == Node.ELEMENT_NODE) {
Element fstElmnt = (Element) fstNode;
if(fstElmnt.getChildNodes().getLength() > 1) {
NodeList fstNmElmntLst = fstElmnt.getChildNodes();
recursiveNodeList(fstNmElmntLst);
} else {
NodeList fstNmElmntLst = fstElmnt.getChildNodes();
if(((Node)fstNmElmntLst.item(0)) != null)
System.out.println(fstNode.getNodeName()+"->"+((Node)fstNmElmntLst.item(0)).getNodeName() + "->"+((Node)fstNmElmntLst.item(0)).getNodeValue());
}
}
}
}
}
EDIT
Другой вопрос: Если я вместо установки названия и заметки, установите категорию так:
Category category = new Category();
category.setStringOne("string1");
category.setStringTwo("string2");
item.setCategory(category);
Тогда результат будет:
item->category->string1string2
Есть ли способ, чтобы получить «string1» и значения «STRING2» в отдельных переменных без использования методов работы со строками?
Большое спасибо! Я раньше не работал с XML, но когда узел становится узлом Text? – Rox
Пожалуйста, также взгляните на мой другой вопрос. Посмотрите мое редактирование (помечено жирным шрифтом) в моем сообщении выше. – Rox
@ Rox - Я обновил свой ответ на основе вашего обновления и предоставил альтернативу, которую вы можете использовать в более удобном для использования. –