Вопрос о том, как решить строковую проблему в Java - PullRequest
1 голос
/ 17 декабря 2010

Я создал простой 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) для извлечения всех узлов [name], в выпадающем списке будет раскрывающийся список, но все элементы будут пустыми, как будто я вставил 10 пустых строк.

Кроме того, если я попытаюсь добавить строку «Hello World» в поле со списком после вышеуказанного кода, элемент «Hello World» появится после 10 пустых элементов.

Я потратилвесь день отладки, но все еще без прорывов, XML на самом деле довольно прост, а Java также проста.Может ли кто-нибудь поделиться со мной своими мыслями по этому поводу, пожалуйста.Большое спасибо!

Ответы [ 2 ]

4 голосов
/ 17 декабря 2010

Это потому, что список узлов также содержит текстовые узлы.

Если вы добавите следующий фрагмент к своему коду, вы обнаружите, что

for(int j = 0;j<nl.getLength();j++){
    System.out.println(nl.item(j).getNodeName());
}

Это даст следующий вывод для каждой итерации продукта

#text
code
#text
name
#text

Это означает, что вы должны получить третий элемент, чтобы получить узел 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 голос
/ 17 декабря 2010

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;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...