关于如何解决Java中的字符串问题的问题

时间:2010-12-17 03:41:28

标签: java xml xpath

我在这里创建了一个简单的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也很简单。请大家和我分享一些想法。非常感谢!

2 个答案:

答案 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;
  }