2012-03-14 3 views
1

У меня есть класс 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» в отдельных переменных без использования методов работы со строками?

ответ

1

Ошибка в вашем методе recursiveNodeList. В случае с одним элементом вы попали в линию System.out.println с узлом Element, а в случае двух элементов вы попали в линию System.out.println с узлом Text. Код ниже будет работать, но, вероятно, нужно очистить.

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(); 
       Node node = fstNmElmntLst.item(0); 
       if(node != null) 
        if(node.getNodeType() == Node.ELEMENT_NODE) { 
         System.out.println(fstNode.getNodeName()+"->"+node.getNodeName() + "->"+((Element)node).getTextContent()); 
        } else { 
         System.out.println(fstNode.getNodeName()+"->"+node.getNodeName() + "->"+node.getNodeValue()); 
        } 
       } 
      } 
     } 
    } 
} 

UPDATE

Ваш JAXB (JSR-222) реализация правильно создания документа. Исходные и обновленные ошибки, которые вы видите, связаны с тем, как вы обрабатываете узлы DOM в recursiveNodeList. Если вы заинтересованы в продолжении этого подхода, я бы рекомендовал пройти через код и обратить внимание на то, когда текущий узел соответствует тегу (то есть note) и имеет тип Element, и когда он соответствует тексту (то есть Notetest1) и является типа Текст. Ниже я привел новый пример кода, который использует XPath для изучения документа, который может оказаться проще в использовании.

package forum9698306; 

import javax.xml.bind.*; 
import javax.xml.parsers.*; 
import javax.xml.xpath.*;  
import org.w3c.dom.*; 

public class JavaXML { 

    public static void main(String[] args) throws Exception { 
     Item item = new Item(); 

     JAXBContext jaxb = JAXBContext.newInstance(item.getClass().getPackage().getName());   
     Marshaller marshaller = jaxb.createMarshaller(); 
     item.setNote("Notetest1"); 
     item.setTitle("Title1"); 

     Category category = new Category(); 
     category.setStringOne("string1"); 
     category.setStringTwo("string2"); 
     item.setCategory(category); 

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     dbf.setNamespaceAware(true); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.newDocument(); 
     marshaller.marshal(item, doc); 

     XPathFactory xpf = XPathFactory.newInstance(); 
     XPath xpath = xpf.newXPath(); 
     System.out.println(xpath.evaluate("item/note/text()", doc, XPathConstants.STRING)); 
     System.out.println(xpath.evaluate("item/title/text()", doc, XPathConstants.STRING)); 
     System.out.println(xpath.evaluate("item/category/stringOne/text()", doc, XPathConstants.STRING)); 
     System.out.println(xpath.evaluate("item/category/stringTwo/text()", doc, XPathConstants.STRING)); 
    } 

} 

Выход

Notetest1 
Title1 
string1 
string2 
+0

Большое спасибо! Я раньше не работал с XML, но когда узел становится узлом Text? – Rox

+0

Пожалуйста, также взгляните на мой другой вопрос. Посмотрите мое редактирование (помечено жирным шрифтом) в моем сообщении выше. – Rox

+0

@ Rox - Я обновил свой ответ на основе вашего обновления и предоставил альтернативу, которую вы можете использовать в более удобном для использования. –

Смежные вопросы