我使用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?当我同时调用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());
}
}
}
}
}
修改
另一个问题: 如果我不是设置标题和注释,请设置如下类别:
Category category = new Category();
category.setStringOne("string1");
category.setStringTwo("string2");
item.setCategory(category);
然后输出为:
item->category->string1string2
有没有办法在不使用字符串操作技术的情况下将“string1”和“string2”值转换为单独的变量?
答案 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