みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

です。

回答よろしくお願いします。

投稿日時 - 2014-10-21 19:11:14

QNo.8798424

困ってます

このQ&Aは役に立ちましたか?

19人が「このQ&Aが役に立った」と投票しています

回答(1)

変換するにあたってどこがわからないの?

投稿日時 - 2014-10-21 19:30:17

補足

そこを書いてませんでしたすいません

私の現在のプログラムでは、

item codeの属性値
nameの内容
makerの内容
option secの属性値

以外は例の通り表示できているんですが

item codeの属性値を指定されているところに表示できなくて困っています。

投稿日時 - 2014-10-23 13:08:34

あなたにオススメの質問