Parser DOM

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>
0

a co w tym nie działało?

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();
	}
}
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/javase/1,5.0/docs/api/org/w3c/dom/Node.html#getNodeValue() - szczegóły na samej górze strony

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.

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