XML - parsowanie

Odpowiedz Nowy wątek
2014-06-29 11:55
kong
0

Witam,

znalazłem w internecie przykład parsowania XML:
http://www.mkyong.com/java/ho[...]-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..

Pozostało 580 znaków

2014-06-29 12:08
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[...]Node.html#getChildNodes%28%29)


Registered Linux user #456405 | SCJP 6 | SCWCD 5 | SCBCD 5

Pozostało 580 znaków

2014-06-29 12:23
kong
0

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

Pozostało 580 znaków

2014-06-30 09:46
kong
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.

Błąd frazeologiczny, napotkałem problem lub natknąłem się na problem ale nie napotkałem się na problem. - bogdans 2014-06-30 10:17

Pozostało 580 znaków

2014-06-30 15:52
SSIM
0

Witam,

też mam problem z parsowaniem XML. Znalazłem fajny przykład SAX:
http://www.javacodegeeks.com/[...]ing-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 00:00:00 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 00:00:00 NPT 1995, publisher=Nepal, price=500, authors=[Mahesh Poudel, Bikram Adhikari, Ramesh Poudel]]

Tylko:

[email protected]
[email protected]

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;
    }
}

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