gpt4 book ai didi

java - JAXB:为什么如果我只设置某个值,该值会返回 null,而当我设置其他值时,会返回实际值?

转载 作者:太空宇宙 更新时间:2023-11-04 08:20:11 25 4
gpt4 key购买 nike

我使用 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(),为什么注释为空?为什么当我调用 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”值放入单独的变量中?

最佳答案

错误出现在您的 recursiveNodeList 方法中。在单元素情况下,您使用 Element 节点点击 System.out.println 行,在两元素情况下,您使用 Text 节点点击 System.out.println 行。下面的代码可以工作,但可能需要清理。

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 来内省(introspection)文档,您可能会发现它更易于使用。

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

关于java - JAXB:为什么如果我只设置某个值,该值会返回 null,而当我设置其他值时,会返回实际值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9698306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com