JAXB:如果我只设置该值,为什么值返回null,并在设置其他值时返回实数值?

时间:2012-03-14 08:34:27

标签: java xml xsd jaxb

我使用JAXB从xsd架构中编写了一个java类。 在Main类中,我有一个名为recursiveNodeList(NodeList list)的方法,它只接受一个节点列表并递归迭代它以获取所有值。

除了我无法理解的一件事之外,一切都有效。

在下面的代码中,我有以下两行:

item.setNote("Notetest1");
item.setTitle("Title1");

当我运行代码时,我得到了这个输出:

title->#text->Title1
note->#text->Notetest1

如果我只使用其中一行,例如:

item.setNote("Notetest1");
// item.setTitle("Title1"); /*commented out*/

我得到了这个输出:

item->note->null

如果我只是设置了该值而没有调用setTitle(),为什么注释为null?当我同时调用setNotesetTitle?时,为什么它有值?

整个代码:

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());
                }
            }
        }
    }
}

修改

另一个问题: 如果我不是设置标题和注释,请设置如下类别:

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

然后输出为:

item->category->string1string2

有没有办法在不使用字符串操作技术的情况下将“string1”和“string2”值转换为单独的变量?

1 个答案:

答案 0 :(得分: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());
                    }
                }
            }
        }
    }
}

<强>更新

您的JAXB(JSR-222)实现正在正确创建文档。您看到的原始和更新错误是由于您在recursiveNodeList中处理DOM节点的方式。如果您有兴趣继续这种方法,我建议单步执行代码并注意当前节点何时对应一个标签(即note)并且类型为Element,并且当它对应于文本时(即Notetest1)并且是Text类型。下面我给出了一个新的代码示例,该示例使用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