XML - parsowanie

0

Witam,

znalazłem w internecie przykład parsowania XML:
http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/

Z tym, że u mnie plik XML jest trochę bardziej skomplikowany:

<?xml version="1.0"?>
<company>
	<staff id="1001">
		<type typname="employee">
			<position posname="specjalist">
				<firstname>yong</firstname>
				<lastname>mook kim</lastname>
				<nickname>mkyong</nickname>
				<salary>200000</salary>
			</position> 
			<position posname="junior specjalist">
				<firstname>jan paul</firstname>
				<lastname>knogh</lastname>
				<nickname>dykhong</nickname>
				<salary>100000</salary>
			</position> 
		</type>	
		<type typname="cooperator">
			<position posname="specjalist">
				<firstname>ben</firstname>
				<lastname>white</lastname>
				<nickname>bwh</nickname>
				<salary>250000</salary>
			</position> 
		</type>
	</staff>
	<staff id="2001">
		<type typname="cooperator">
			<position posname="expert">
				<firstname>low</firstname>
				<lastname>yin fong</lastname>
				<nickname>fong fong</nickname>
				<salary>500000</salary>
			</position>
		</type>
	</staff>
</company>

No i na początku wychodzę od:

NodeList nList = doc.getElementsByTagName("staff");

I w ten sposób mam atrybut ID.

Później wychodzę od:

NodeList nList = doc.getElementsByTagName("type");

I w ten sposób mam atrybut TYPNAME.

Dalej:

NodeList nList = doc.getElementsByTagName("position");

I otrzymuję atrybut POSNAME oraz wartości FIRSTNAME, LASTNAME, NICKNAME, SALARY.

Muszę sterować cały czas doc.getElementsByTagName aby odczytywać poszczególne wartości?

Cel jaki chcę osiągnąć, to pogrupować dane (np. w tablicy) najpierw dla ID=1001, później ID=2001 itd..

0

Czy będziesz zmieniał xml wejściowy?
Jeżeli nie, to proponuję użyć StAX zamiast DOM.

Jeżeli jednak chcesz korzystać z DOM, to musisz "chodzić" po drzewie, tzn. zagłębiać się w jego strukturę za pomocą getChildNodes() (http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html#getChildNodes%28%29)

0

XML wejściowy będzie niezmienny. Jedynie co będzie się zmieniało to więcej będzie encji <position> w ramach <type>.

0

Użyłem StAX i napotkałem się na problem.

Mam:

Company.java

package com.ca.xml.stax;

public class Company {
    private int id;
    private String type;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getType() {
    	return type;
    }
    public void setType(String type) {
    	this.type = type;
    }
    
     
    @Override
    public String toString() {
    	
    	return "FORMID:: ID=" + this.id + " TYPE=" + this.type;
    }
     
}

Oraz StaxXMLStreamReader.java:

package com.ca.xml.stax;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
 
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
 
public class StaxXMLStreamReader {
 
    public static void main(String[] args) {
        String fileName = "D:\\company.xml";
        List<Company> comList = parseXML(fileName);
        for(Company com : comList){
            System.out.println(com.toString());
        }
    }
 
    private static List<Company> parseXML(String fileName) {
        List<Company> comList = new ArrayList<>();
        Company com = null;
        XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
        try {
            XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(new FileInputStream(fileName));
            int event = xmlStreamReader.getEventType();
            while(true){
                switch(event) {
                case XMLStreamConstants.START_ELEMENT:
                    if(xmlStreamReader.getLocalName().equals("staff")){
                        com = new Company();
                        com.setId(Integer.parseInt(xmlStreamReader.getAttributeValue(0)));
                        
                    
                    }else if(xmlStreamReader.getLocalName().equals("type")){
                    	com.setType(xmlStreamReader.getAttributeValue(0));
                    }
                    break;
                case XMLStreamConstants.CHARACTERS:
                    break;
                case XMLStreamConstants.END_ELEMENT:
                    if(xmlStreamReader.getLocalName().equals("staff")){
                        comList.add(com);
                    }
                    break;
                }
                if (!xmlStreamReader.hasNext())
                    break;
 
              event = xmlStreamReader.next();
            }
             
        } catch (FileNotFoundException | XMLStreamException e) {
            e.printStackTrace();
        }
        return comList;
    }
}

W wyniku otrzymuję:

FORMID:: ID=1001 TYPE=cooperator
FORMID:: ID=2001 TYPE=cooperator

Gdzie:

<type typname="employee">

Został pominięty.

0

Witam,

też mam problem z parsowaniem XML. Znalazłem fajny przykład SAX:
http://www.javacodegeeks.com/2012/01/xml-parsing-using-saxparser-with.html

tyle, że nie otrzymuję wyniku jak w linku:

Book [lang=ENG, title=Operating Systems, id=001, isbn=23-34-42-3, regDate=Thu May 24 0000 NPT 1990, publisher=USA, price=400, authors=[Ganesh Tiwari]]
Book [lang=null, title=Distributed Systems, id=002, isbn=24-300-042-3, regDate=Fri May 12 0000 NPT 1995, publisher=Nepal, price=500, authors=[Mahesh Poudel, Bikram Adhikari, Ramesh Poudel]]

Tylko:

com.ca.book.Book@62300f65
com.ca.book.Book@4142e23f

Chodzi zapewne o ten kod:

private void printDatas() {
    	
       // System.out.println(bookL.size());
        for (Book tmpB : bookL) {
            System.out.println(tmpB.toString());
        }
    }

jak pobrać z tego wynik w formie listy?

Gettery i settery napisałem tak:

package com.ca.book;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Book class stores book information, after parsing the xml
 * @author Ganesh Tiwari
 */
public class Book {
    String lang;
    String title;
    String id;
    String isbn;
    Date regDate;
    String publisher;
    int price;
    List<String> authors;
    public Book(){
        authors=new ArrayList<String>();
    }
    //getters and setters
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getLang() {
        return lang;
    }
    public void setLang(String lang) {
        this.lang = lang;
    }
    public String getIsbn() {
        return isbn;
    }
    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public Date getRegDate() {
        return regDate;
    }
    public void setRegDate(Date regDate) {
        this.regDate = regDate;
    }
    public String getPublisher() {
        return publisher;
    }
    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }
	public List<String> getAuthors() {
		return authors;
	}
}

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