使用Java代码的XML解析器
问题描述:
我想通过XML文件填充下拉列表。 我已经创建了XML文件,并且我已经编写了第一个读取xml文件的代码,并且只给我从xml文件中编译的项目,但是当我想稍后运行代码时给了我错误。使用Java代码的XML解析器
public ArrayList readXML(){
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db;
try {
db = dbf.newDocumentBuilder();
Document dom;
dom = db.parse("PVS_XML.xml");
Element docEle = dom.getDocumentElement();
NodeList nl = docEle.getElementsByTagName("item");
System.out.println(((Node) nl).getNodeValue());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
错误消息:
java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl cannot be cast to org.w3c.dom.Node
at de.sidion.pvsng.pages.InputPage.readXML(InputPage.java:222)
at de.sidion.pvsng.pages.InputPage.init(InputPage.java:255)
at de.sidion.pvsng.pages.InputPage.<init>(InputPage.java:183)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
答
你不能投一个节点列表中的节点。获取列表中的第一个元素,如果这是你想要的
NodeList nl = docEle.getElementsByTagName("item");
...
((Node) nl).getNodeValue() <-- this
如果你真的想要的是,无论是浏览清单或获取列表的元素:
for(Node n : nl)
System.out.println(n.getNodeValue());
编辑
我的错误,这不是itterable,试图通过规模做到这一点:
for(int i=0; i < nl.getLength(); i++)
{
Node childNode = nl.item(i);
System.out.println(childnode.getNodeValue());
}
但是,我怀疑这还不是你想要做的,因为你得到的是元素,元素没有值,它们有文本节点有值。这意味着你需要子节点(文本节点)。所以你可能想要类似
for(int i=0; i<nodeList.getLength(); i++)
{
Element childElement = (Element)nodeList.item(i);
NodeList innernodes = childElement.getChildNodes();
System.out.println(innernodes.item(0).getNodeValue());
}
我也会说异常报告的第一行清楚地告诉你这一点。 – Woody 2012-07-06 11:07:02
public ArrayList readXML(){ \t \t \t \t DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); \t \t DocumentBuilder db; \t \t \t尝试{ \t \t 分贝= dbf.newDocumentBuilder(); \t \t \t \t \t Document dom; \t \t \t dom = db.parse(“PVS_XML.xml”); \t \t元素docEle = dom.getDocumentElement(); \t \t \t \t NodeList nl = docEle.getElementsByTagName(“item”); \t \t((Node)nl).getNodeValue(); \t \t \t 为\t(节点n:NL){ \t \t的System.out.println(n.getNodeValue()); \t \t} \t \t \t}赶上(例外五){ \t \t \t \t // TODO自动生成的catch程序块 \t \t \t \t即的printStackTrace(); \t \t \t} \t \t return null; \t} – Pita 2012-07-06 11:11:00
做到了像你说的,但在那里说:\t \t为(节点n:NL){ 它强调NL和它说只能遍历数组或java.lang.Iterable – Pita 2012-07-06 11:11:35