繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM