如何使用JxPath和DOM解析器解析XML文件
问题描述:
我需要一个简单的示例如何使用Java DOM解析器和Apache JxPath解析XML文件。我意识到使用DOM解析器技术,但现在我试图将JxPath整合到我的源代码中。如何使用JxPath和DOM解析器解析XML文件
我已经在网络中搜索,但我找不到工作示例。
为了测试我有这样的XML:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<cd gender="male">
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd gender="male">
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
</cd>
</catalog>
Java代码:
File file = new File("Files/catalog.xml");
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
try
{
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(file);
NodeList nList = doc.getElementsByTagName("cd");
for(int j = 0; j<nList.getLength(); j++){
Element element = (Element)nList.item(j);
System.out.println(element.getElementsByTagName("artist").item(0).getTextContent() + "\n");
}
}
catch (ParserConfigurationException | SAXException | IOException e)
{
e.printStackTrace();
}
我已阅读类集装箱,DocumentContainer和JXPathContext,但 我将不胜感激一些帮助或特定工作示例的Web源代码。
答
下面是与您的工作类似的示例。
File file = new File("Files/catalog.xml");
DocumentContainer dc = new DocumentContainer(file.toURI().toURL());
JXPathContext ctx = JXPathContext.newContext(dc);
Iterator iter = ctx.iterate("//cd/artist");
//In this case, following API will return DOM object
//Iterator iter = ctx.selectNodes("//cd/artist").iterator();
while (iter.hasNext()) {
System.out.println(iter.next());//object type is String
}
答
您确定JXPath是您需要的吗? JXPath是一个Apache库,用于在不一定需要XML的东西上使用XPath表达式,如Java对象树或地图。如果你已经从你的XML中创建了一个DOM,你可以使用它的默认Java XPath实现。请看这里:https://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/XPathFactory.html。事实上,会的JXPath对着干,你在这里,因为DOM有一个像Element
和Text
与像元素名的元数据对象的树。因此,不要像//cd/artist
这样的表达式得到类似的东西。
现在,如果您出于某种原因必须能够在不知道事先知道的情况下,对可能是Java对象树或DOM的某些东西使用XPath表达式,那么JXPath将是一个很好的使用 - 案例在beckyang在他们的答案中描述的方法:使用的JXPath DocumentContainer访问文档。
答
是的,我从几个小时阅读和的JXPath我现在明白这个API的逻辑的答案
许多感谢。这里是一些代码形式我
public class Main {
private final static Logger log = Logger.getLogger(Main.class);
public static void main(String[] args) {
PropertyConfigurator.configure("log4j.properties");
File file = new File("students.xml");
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
try
{
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(file);
NodeList nList = doc.getElementsByTagName("cd");
for(int j = 0; j<nList.getLength(); j++){
Element element = (Element)nList.item(j);
JXPathContext context = JXPathContext.newContext(element);
log.debug(context.getValue("company/address/city[2]"));
}
}
catch (ParserConfigurationException | SAXException | IOException e)
{
e.printStackTrace();
}
}