Чтение содержимого XML с использованием Java - PullRequest
0 голосов
/ 08 мая 2011

Я пытаюсь прочитать XML-файл , используя Java.Я могу успешно прочитать файл, но проблема в том, что я не знаю, как прочитать значения внутри тега столбца.

Поскольку теги столбцов не уникальны, я не знаю, как их читать.Может ли кто-нибудь помочь мне.

Заранее спасибо.

 import java.net.URL;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XMLReader {

 public static void main(String argv[]) {

  try {
      //new code
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      DocumentBuilder db = dbf.newDocumentBuilder();
      Document doc = db.parse(new URL("http://www.cse.lk/listedcompanies/overview.htm?d-16544-e=3&6578706f7274=1").openStream());

      doc.getDocumentElement().normalize();
      System.out.println("Root element " + doc.getDocumentElement().getNodeName());
      NodeList nodeLst = doc.getElementsByTagName("row");
      System.out.println("Information of all Stocks");

      for (int s = 0; s < nodeLst.getLength(); s++) {

        Node fstNode = nodeLst.item(s);

        if (fstNode.getNodeType() == Node.ELEMENT_NODE) {

          Element fstElmnt = (Element) fstNode;
          //NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("column");
          //Element fstNmElmnt = (Element) fstNmElmntLst.item(0);
          //NodeList fstNm = fstNmElmnt.getChildNodes();
          //System.out.println("First Tag : "  + ((Node) fstNm.item(0)).getNodeValue());
          NodeList lstNmElmntLst = fstElmnt.getElementsByTagName("column");
         // Element lstNmElmnt = (Element) lstNmElmntLst.item(0);

          for (int columnIndex = 0; columnIndex < lstNmElmntLst.getLength(); columnIndex++) {
              Element lstNmElmnt = (Element) lstNmElmntLst.item(columnIndex);
              NodeList lstNm = lstNmElmnt.getChildNodes();
              System.out.println("Last Tag : " + ((Node) lstNm.item(0)).getNodeValue());
              }

        }

      }
      } catch (Exception e) {
        e.printStackTrace();
  }
 }
}

Ответы [ 2 ]

2 голосов
/ 08 мая 2011

Этот код:

NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("column");

Возвращает список узлов столбцов, почему бы просто не использовать цикл for для итерации по всем вместо того, чтобы просто читать первый?

for (int columnIndex = 0; columnIndex < fstNmElmntLst.getLength(); columnIndex++) {
Element fstNmElmnt = (Element) fstNmElmntLst.item(columnIndex);
...
}
1 голос
/ 08 мая 2011

Теперь вы получаете NPE для:

<column/>

, и вы должны проверить размер списка, прежде чем получите элемент 0:

 NodeList lstNm = lstNmElmnt.getChildNodes();
 if (lstNm.getLength() > 0) {
    System.out.println("Last Tag : " + ((Node)lstNm.item(0)).getNodeValue());
 } else {
     System.out.println("No content");
 }

А так как вы обрабатываете текстовое содержимое в узлах, посмотрите на ответ на этот вопрос .Текстовые узлы раздражают:

<foo>
   a
   b
   c
 </foo>

может быть или является более чем одним дочерним узлом foo, а getTextContent() может немного облегчить боль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...