Java 为什么我在尝试创建JDOM文档时会得到一个不同的文档模板?
我试图解析zipfile zip条目中的输入流,并试图创建org.w3c.dom.Document,但由于某种原因,我得到了一个不同的文档。我还在创建一个新的org.w3c.dom.Document,这将返回一个DocumentImpl。然后使用Xpath选择单个节点,但当我试图查找特定节点时,我发现org.apache.xerces.dom.DocumentImpl与org.jdom.Element不兼容。我做了一些搜索,但似乎找不到和例子。有人知道我为什么不把我的文档创建为dom文档吗?提前谢谢你的帮助Java 为什么我在尝试创建JDOM文档时会得到一个不同的文档模板?,java,Java,我试图解析zipfile zip条目中的输入流,并试图创建org.w3c.dom.Document,但由于某种原因,我得到了一个不同的文档。我还在创建一个新的org.w3c.dom.Document,这将返回一个DocumentImpl。然后使用Xpath选择单个节点,但当我试图查找特定节点时,我发现org.apache.xerces.dom.DocumentImpl与org.jdom.Element不兼容。我做了一些搜索,但似乎找不到和例子。有人知道我为什么不把我的文档创建为dom文档吗?提前
//create a zip file from the crate location
File downloadFile = crate.getLocation();
ZipFile zipFile = new ZipFile(downloadFile);
//put all the contents of the zip file into an enumeration
Enumeration entries = zipFile.entries();
while (entries.hasMoreElements()){
ZipEntry entry = (ZipEntry) entries.nextElement();
String currentEntry = entry.getName();
if (currentEntry.equals("ATTACH 8130-3 XML/signature.xml")){
InputStream zipStream = zipFile.getInputStream(entry);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
org.w3c.dom.Document doc = (org.w3c.dom.Document)dBuilder.parse(zipStream);
doc.getDocumentElement().normalize();
NodeList certNode = doc.getElementsByTagName("ATA_PartCertificationForm");
int testInt = certNode.getLength();
org.w3c.dom.Document doc2 = (org.w3c.dom.Document) dBuilder.newDocument();
Node parentNode = doc.getParentNode();
Element rootElement = doc2.createElement("CurrentCertificate");
doc2.appendChild(rootElement);
for(int i=0; i<certNode.getLength(); i++){
Node childNode = certNode.item(i);
Element childElement;
childElement = (Element)certNode.item(i);
rootElement.appendChild(doc2.importNode(childNode, true));
String nameString = childNode.getNodeName();
Element block13Element = (Element) XPath.selectSingleNode(doc2, "//Block13M");
System.out.println("tester test");
}
System.out.println("Test break");
}
}
您正在将org.w3c.dom.Document传递给jdom.xpath.xpath.selectSingleNode,但该方法需要org.jdom.Document或org.jdom.Element 这里有一种方法可以将XML解析为JDOM文档,并使用Jaxen执行XPath查询,Jaxen也必须位于类路径中
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class JdomXpathSandbox {
public static void main(String[] args) throws Exception {
InputStream is = ...;
Document document = new SAXBuilder().build(is);
Element rootElement = document.getRootElement();
String xpathExpression = ...
List matchingNodes = XPath.selectNodes(rootElement, xpathExpression);
}
}
我想你正在使用JDOM+Jaxen?不,我没有使用Jaxen。我试图使用jdom.Xpath。我真正想做的是从zipfile中提取一个xml文件。然后使用提取的XML文件中的一些元素创建新的XML。我的理解是,JDOM使用Jaxen作为默认的XPath引擎。一旦您通过了当前的异常,您可能会遇到java.lang.NoClassDefFoundError:org/jaxen/jdom/JDOMXPath—您可以通过将jaxen添加到类路径来解决这个问题。啊,我明白了。我只是改变了一切,使用JDOM文档和SAXBuilder,它工作得很好。新手犯的错误。谢谢你的帮助!不客气!如果您愿意将此标记为已接受的答案,我同样将不胜感激;