我在这里创建了一个简单的xml文件:
http://roberthan.host56.com/productsNew.xml
这很简单,根节点是[products],而所有其他元素节点都是[product]。在每个[product]节点下,有两个子节点,[code]和[name],所以它基本上看起来像:
[product]
[code]ddd[/code]
[name]ssss[/name]
[/product]
我还编写了以下Java代码来解析此XML文件并取出[product]节点的文本内容,并将其添加到JComboBox。
docBuilder = docFactory.newDocumentBuilder();
doc = docBuilder.parse("http://roberthan.host56.com/productsNew.xml");
NodeList productNodes = doc.getElementsByTagName("product");
productlist.clear();
for (i = 0; i < productNodes.getLength(); i++)
{
Node childNode = productNodes.item(i);
if (childNode.hasChildNodes()) {
NodeList nl = childNode.getChildNodes();
Node nameNode = nl.item(2);
productlist.add(nameNode.getTextContent());
}
}
final JComboBox productComboB = new JComboBox();
Iterator iterator = productlist.iterator();
while(iterator.hasNext())
{
productComboB.addItem(iterator.next().toString());
}
代码非常简单,我首先解析xml并获取所有产品节点并将它们放入节点列表中,productList是一个arrayList。我遍历所有[product]节点,对于每个节点,如果它有子节点,那么我取第二个子节点(它是[name]节点)并将它的文本内容放在数组列表中,最后,我遍历arrayList并将每个项目添加到组合框中。
我得到的问题是,如果我选择[code]子节点,这意味着“Node nameNode = nl.item(1)”,它将完美地工作;但是,如果我将项目(1)更改为项目(2)以提取所有[名称]节点,组合框将有一个下拉列表,但所有项目都是空白的,就像我插入了10个空字符串。 / p>
另外,如果我尝试在上面的代码之后将“Hello World”字符串添加到组合框中,则“Hello World”项目将出现在10个空项目之后。
我花了整整一个下午调试这个,但仍然没有突破,XML实际上非常简单,Java也很简单。请大家和我分享一些想法。非常感谢!
答案 0 :(得分:4)
这是因为节点列表也包含文本节点。
如果您将以下代码段添加到代码中,您会发现
for(int j = 0;j<nl.getLength();j++){
System.out.println(nl.item(j).getNodeName());
}
它将为产品的每次迭代提供以下输出
#text
code
#text
name
#text
这意味着您必须获取第3个元素才能获得name
节点。
Node nameNode = nl.item(3);
但我建议你使用XPath来解决这个问题。
NodeList nodelist = XPathAPI.selectNodeList(doc, "//products/product/name");
for (int i = 0; i < nodelist.getLength(); i++) {
productlist.add(nodelist.item(i).getTextContent());
}
答案 1 :(得分:1)
使用此表达式的XPath可以轻松解决您的问题:
String XPATH_EXPRESSION1 = "//name/text()";
如,
public static final String PRODUCTS_NEW = "http://roberthan.host56.com/productsNew.xml";
public static final String XPATH_EXPRESSION1 = "//name/text()";
public XmlFun() {
URL productsUrl;
try {
productsUrl = new URL(PRODUCTS_NEW);
List<String> nameList = xPathExtract(productsUrl.openStream());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (XPathExpressionException e) {
e.printStackTrace();
}
}
private List<String> xPathExtract(InputStream inStream) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document domDoc = builder.parse(inStream);
XPathFactory xFactory = XPathFactory.newInstance();
XPath xpath = xFactory.newXPath();
XPathExpression xExpr = xpath.compile(XPATH_EXPRESSION1);
NodeList nodes = (NodeList)xExpr.evaluate(domDoc, XPathConstants.NODESET);
List<String> resultList = new ArrayList<String>();
for (int i = 0; i < nodes.getLength(); i++) {
String node = nodes.item(i).getNodeValue();
resultList.add(node);
}
return resultList;
}