Parser DOM

Odpowiedz Nowy wątek
2011-08-19 22:41
0

Cześć. Chciałem napisać sobie prosty parser XMLa i napisałem. Problem w tym, że niepoprawnie : ) Wiem jak już napisać to żeby działało ok, ale mimo to nie rozumiem dlaczego moje rozumowanie jest błędne. Poniżej mój początkowy niedziałający kod (doc jest typu Document):

public void parseFile(String filePath) {
        try {
            doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(filePath);
        } 
        catch (SAXException e) {e.printStackTrace();} 
        catch (IOException e) {e.printStackTrace();}
        catch (ParserConfigurationException e) {e.printStackTrace();}
 
        NodeList listOfUsers = doc.getElementsByTagName("user");
 
        // iteruje po wezlach <user> :
        for(int i=0; i<listOfUsers.getLength(); i++)
        {
            // biore pojedynczego <usera>:
            Node userNode = listOfUsers.item(i);  
            // userNodes zawiera wezly z danymi pojedycznego usera:
            NodeList userNodes = userNode.getChildNodes();  
            // dla kazdego takiego wezla wypisuje jego nazwe i wartosc (wydawalo mi sie to intuicyjne):
            for(int j=0; j<userNodes.getLength(); j++)
            {
                String nodeName = userNodes.item(j).getNodeName();
                String nodeValue = userNodes.item(j).getNodeValue();
                System.out.println(nodeName + ": " + nodeValue);
            }
        }       
    }
 

XML:

<users> 
  <user>
    <name>Imie</name>
    <surname>Nazwisko</surname>
    <age>19</age>
  </user>
</users>
edytowany 1x, ostatnio: javaBeginner, 2011-08-19 22:42

Pozostało 580 znaków

2011-08-20 01:16
0

a co w tym nie działało?

Pozostało 580 znaków

2011-08-22 01:21
0

Wynik działania powyższego programu był następujący:

#text: 

name: null
#text: 

surname: null
#text: 

age: null
#text: 

Dodam jeszcze, że poprawne działanie można osiągnąć poniższym kodem:

{ // ...
    public void parseFile(String filePath) {
        try {
            doc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
                    .parse(filePath);
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
 
        NodeList listOfUsers = doc.getElementsByTagName("user");
 
        for (int i = 0; i < listOfUsers.getLength(); i++) {
            Node userNode = listOfUsers.item(i);
 
            Element element = (Element) userNode;
            System.out.println("Imie: " + getTagValue("name", element));
            System.out.println("Nazwisko: " + getTagValue("surname", element));
            System.out.println("Wiek: " + getTagValue("age", element));
        }
    }
 
    private String getTagValue(String tagName, Element e) {
        NodeList nl = e.getElementsByTagName(tagName).item(0).getChildNodes();
        Node n = (Node) nl.item(0);
 
        return n.getNodeValue();
    }
}
edytowany 1x, ostatnio: javaBeginner, 2011-08-22 01:58

Pozostało 580 znaków

2011-08-22 02:49
0

jeżeli chodzi o #text
to pomiędzy znacznikami masz pewne białe znaki, które zostały zinterpretowane jako węzły tekstowe występujące między tymi znacznikami, a ich zawartość wypisana

a jeżeli chodzi o null, to bo tak :D
http://download.oracle.com/ja[...]/dom/Node.html#getNodeValue() - szczegóły na samej górze strony

Pozostało 580 znaków

2011-08-23 17:15
sammael-s1
0

kiedys tez na taki problem trafilem ale potrzebowalem wartosci z xml wpisac w konkretne zmienne wiec zrezygnowalem z petli calkiem i wpisalem to mniej wiecej tak :

try{
        File file = new File("jakis.xml");
          DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
          DocumentBuilder db = dbf.newDocumentBuilder();
          Document doc = db.parse(file);
          doc.getDocumentElement().normalize();
 
          NodeList UsersNodeList = doc.getElementsByTagName("user");
 
          for(int i=0; i<UsersNodeList.getLength(); ++i){
              Node UserNode = UsersNodeList.item(i);
              Element UserElement = (Element) UserNode;
              NodeList User = UserElement.getChildNodes();
 
              NodeList nameNodeList = UserElement.getElementsByTagName("name");
              Element nameElement = (Element) nameNodeList.item(0);
              NodeList name = nameElement.getChildNodes();
 
              String strName = ((Node) name.item(0)).getNodeValue();
 
              NodeList surnameNodeList = UserElement.getElementsByTagName("surname");
              Element surnameElement = (Element) surnameNodeList.item(0);
              NodeList surname = surnameElement.getChildNodes();
 
              String strSurname = ((Node) surname.item(0)).getNodeValue();
 
              NodeList ageList = UserElement.getElementsByTagName("age");
              Element ageElement = (Element) ageList.item(0);
              NodeList age = ageElement.getChildNodes();
 
              String strAge = ((Node) age.item(0)).getNodeValue();
 
              System.out.println(strName);
              System.out.println(strSurname);
              System.out.println(strAge);
 
          }
 
        }catch(Exception e){
            e.printStackTrace();
        }
 

ale nie wiem czy Tobie odpowiada taki sposob.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0