[英]A question on how to solve the string problem in Java
我在这里创建了一个简单的xml文件:
http://roberthan.host56.com/productsNew.xml
这很简单,根节点是[产品],而所有其他元素节点是[产品]。 在每个[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]节点,对于每个[product]节点,如果有子节点,那么我取第二个子节点(即[name]节点)并将其文本内容放入数组列表中,最后,我遍历arrayList并将每个项目添加到组合框中。
我遇到的问题是,如果我选择[code]子节点,这意味着“节点nameNode = nl.item(1)”,它将可以完美地工作; 但是,如果我将item(1)更改为item(2)以提取所有[name]节点,则组合框将具有一个下拉列表,但是所有项目均为空白,例如我插入了10个空字符串。
另外,如果我尝试在上述代码后的组合框中添加“ Hello World”字符串,则“ Hello World”项将出现在10个空项之后。
我整个下午都在调试它,但仍然没有突破,XML实际上非常简单,而Java也非常简单。 任何人都可以跟我分享一些想法。 非常感谢!
这是因为节点列表还包含文本节点。
如果将以下代码段添加到您的代码中,则会发现
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());
}
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.