XML文書をjavaを使ってCSV文書に...
プログラム初心者なのですが
csv.jpgのような形で、DOM,SAXどちらかを
使って変換したいのですが誰か教えてください。
xmlは
-<item_list>-
<item code="1">
<name>靴下</name>
<maker>マイクロソフト</maker>-
<option seq="1">
<attribute name="材質">ナイロン</attribute>
<attribute name="サイズ">S</attribute>
<attribute name="色">黒</attribute><attribute name="性別">男</attribute><price>500</price>
</option>-
<option seq="2">
<attribute name="材質">ナイロン</attribute>
<attribute name="サイズ">M</attribute>
<attribute name="色">黒</attribute>
<attribute name="性別">男</attribute><price>500</price>
~
なものが続いてくる形です。
DTDは
<?xml version="1.0" encoding="Shift_JIS" ?>
<!ELEMENT item_list (item+)>
<!ELEMENT item (name+,maker+,option+)>
<!ATTLIST item code NMTOKENS #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT maker (#PCDATA)>
<!ELEMENT option (attribute+,price)>
<!ATTLIST attribute name CDATA #REQUIRED>
<!ELEMENT price (#PCDATA)>
でやっています。
現在のプログラムの状態は
import java.io.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.dom.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
//文書の入出力
class Exam3{
public static void main(String args[]) throws Exception{
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser(); //SAXの準備
SampleHandler1 sh = new SampleHandler1(); //パンドアの作成
sp.parse(new FileInputStream("item_list_japan.xml"), sh); //XML文書をロード
}
}
class SampleHandler1 extends DefaultHandler{ //パンドラクラス
int YS=0;
int YS2=0;
int YS3=0;
String[] ST= new String[80000000];
int ST1=0;
int ab=0;
int ab2=0;
String tin="null";
StringBuffer sb = new StringBuffer(); //文字列を用意
public void endDocument(){ //文書の終了
try{ //文字列を書き出す
PrintWriter pw = new PrintWriter
(new BufferedWriter
(new FileWriter("List2.csv")));
pw.println(sb);
pw.close();
}catch(Exception e){}
}
public void startElement(String namespaceURI,
String localName,
String qName, //qNameは要素
Attributes attrs) {
if(qName.equals("item")){
YS = 0;
YS2=0;
ab2=0;
sb.append("商品コード"+",");
for(int i=0;i<attrs.getLength();i++){
sb.append(attrs.getValue(i)+",");
}
}else if(qName.equals("name")){
sb.append("商品名"+",");
}else if(qName.equals("maker")){
sb.append("製造元"+",");
}else if(qName.equals("option")){
if(YS2==0){
sb.append("オプション"+",");
YS2=1;
YS3=0;
}
}
if(qName.equals("attribute")){
if(YS3==0){
for(int i=0;i<attrs.getLength();i++){
if(attrs.getValue(i)!=""){
sb.append(attrs.getValue(i)+",");
}
}
YS=1;
}
}else if(YS==1){
YS3=1;
}
tin=qName;
}
public void endElement(String namespaceURI,String localName,String qName){
if(qName.equals("option")){
sb.append("\r\n");
}
//tin=qName;
if(qName.equals("price")){
if(ab2==0){
sb.append("\r\n");
ab2=1;
}
sb.append(",,,,");
while(ST[ab]!=null){
sb.append(ST[ab]);
ab++;
}
}
}
public void characters(char[] ch,int start,int length){
String str = new String(ch,start,length);
if(tin=="attribute"){
ST[ST1]=(str+",");
ST1++;
}
}
}
です。
回答よろしくお願いします。