2

私はJavaとXmlの解析に非常に慣れていません。私の要件は、xml ファイルを取得し、XML ファイルのデータを Java を使用してテーブルと列の形式でデータベースに格納することです。私はグーグルで正しい解決策を見つけようとしました。しかし、私は無力です。これまで私が行ったことは、xml データを動的に取得し、タグ名または値のいずれかを保存することでした。しかし、私の要件は、行形式の特定の列に関連する列名とデータとしてタグ名を1回だけ取得することです。誰でも私のコードを修正してください。

<?xml version="1.0"?>
<company>
    <staff>
        <firstname>yong</firstname>
        <lastname>mook kim</lastname>
        <nickname>mkyong</nickname>
        <salary>100000</salary>
    </staff>
    <staff>
        <firstname>low</firstname>
        <lastname>yin fong</lastname>
        <nickname>fong fong</nickname>
        <salary>200000</salary>
    </staff>
</company>

Java コード

 import java.io.*;
    import javax.xml.parsers.*;
    import org.w3c.dom.*;
    import org.xml.sax.*;

    public class XmlData{
     static public void main(String[] arg){
     try {
     BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
     System.out.print("Enter XML File Path: ");
     String xmlFile = bf.readLine();
     //Store the String into the File
     File file = new File(xmlFile);
     if(file.exists()){
     // Create a factory
     DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
     // Use the factory to create a builder
     DocumentBuilder builder = factory.newDocumentBuilder();
     Document doc = builder.parse(xmlFile);
     Element docEle = doc.getDocumentElement();
     System.out.println("Root element of the document: "+ docEle.getNodeName());
     // Get a list of all elements in the document
     NodeList list = doc.getElementsByTagName("*");

     int totalElements = list.getLength();

     System.out.println("XML Elements: " + totalElements);
     for (int i=0; i<list.getLength(); i++) 
     {
     // Get element
     Element element = (Element)list.item(i);
     String tag=element.getTagName();
     String name=list.item(0).getChildNodes().item(0).getNodeValue();
     System.out.println(name);
     System.out.print(tag);
     System.out.print(" ");
     //System.out.println(element.getNodeName());


     }
     }
     else{
     System.out.print("File not found!");
     }
     }
     catch (Exception e) {
     System.exit(1);
     }
     }
    }

このコードの出力:

company 
staff 
firstname 
lastname 
nickname 
salary 
staff 
firstname 
lastname 
nickname 
salary 

期待される出力:

FirstName, Lastname, nickname  , salary  //column

yong     ,mook kim, mkyong     , 100000   // rows
low      ,yin fong, fong fong   ,200000
4

2 に答える 2

4

FirstNAme、LastName、NickName、Salaryの4つの列を持つデータベーステーブルをすでに作成していると仮定します。

データを読み取ってDBに保存するのは本当に簡単です。

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class ParseStaff {
    public static void main(String [] args){
        parseFile();
    }
    public static void parseFile() {
        //get the factory
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            //Using factory get an instance of document builder
            DocumentBuilder db = dbf.newDocumentBuilder();
            //parse using builder to get DOM representation of the XML file
            //Document dom = db.parse("employees.xml");
            Document dom = db.parse("C:\\GAE\\NetBeansProjects\\Test\\src\\statff.xml");
            //get the root element
            Element docEle = dom.getDocumentElement();
            //get a nodelist of elements
            NodeList nl = docEle.getElementsByTagName("staff");

            if (nl != null && nl.getLength() > 0) {
                for (int i = 0; i < nl.getLength(); i++) {
                    //get the employee element
                    Element el = (Element) nl.item(i);
                    String firstname = getTextValue(el, "firstname");
                    String lastname = getTextValue(el, "lastname");
                    String nickname = getTextValue(el, "nickname");
                    int salary = getIntValue(el, "salary");

                    System.out.println(firstname);
                    System.out.println(lastname);
                    System.out.println(nickname);
                    System.out.println(salary);
                }
            }

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

    }
    private static String getTextValue(Element ele, String tagName) {
        String textVal = null;
        NodeList nl = ele.getElementsByTagName(tagName);
        if (nl != null && nl.getLength() > 0) {
            Element el = (Element) nl.item(0);
            textVal = el.getFirstChild().getNodeValue();
        }

        return textVal;
    }
    private static int getIntValue(Element ele, String tagName) {
        return Integer.parseInt(getTextValue(ele, tagName));
    }
}

印刷します:

yong
mook kim
mkyong
100000
low
yin fong
fong fong
200000
于 2012-07-06T09:41:25.923 に答える