JavaでXMLファイルを読み込むサンプルプログラム
JavaでXMLファイルを読み込むには、DocumentBuilderFactoryクラスを用いればよいのですが、Classを自作してみたら意外と簡単にできたので紹介します。
タグの構造
XMLファイルは、タグで情報が管理されています。
例えば、<a>あいうえお</a>とあれば、タグaの中身は「あいうえお」となります。
人の情報を示す場合はこんな感じ
<人間>
<名前>徳島狸男</名前>
<性別>男</性別>
<年齢>220</年齢>
<詳細情報>
<電話番号>0120-0120</電話番号>
<住所>徳島県の山の中</住所>
</詳細情報>
</人間>
タグの入れ子構造によって情報を区分しています。書き換えると、こんなツリー構造になっています
よく見るとタグには2種類あることがわかります。
木に例えると、枝分けれの部分と、葉の部分です。
このツリーでは、枝別れは人間と詳細情報になります。タグの中に子タグが入っています。そのほかの葉の部分には情報が入っていて、子タグはありません。
タグ情報を格納するクラス
タグの情報を格納するために、ElementというClassを作りました。
Elemantには、
name タグ名を入れる文字列
param 情報を入れる文字列
element[] 小タグを格納するElement配列
を用意しておきます。
public String name ="";
public String param ="";
public Element[] element = null;
Elementのコンストラクタにタグ入りの文字列を渡すと、タグ内文字列の中に子タグがないか調べ、あればElement配列を作成し、子タグ文字列を渡して初期化します。
無ければタグ内の文字列を保持情報としてparamに格納します。
最初にxml文をElamentに渡せば、あとはElementが中に含まれている入れ子のタグを子element、孫element...に自動的に格納してくれます。
サンプルプログラム
タグ情報を格納するElement Classです。Main()内でelementにxml文字列を渡すと、ツリー構造に沿って子elementが作られ、情報が格納されます。
package tomojavalib.swingfx;
import java.util.Vector;
public class Element {
public String name ="";
public String param ="";
public Element[] element = null;
public static void main(String[] s ){
String ss = "<要素><名前>線A</名前><種類>2点直線</種類><始点>点X</始点><終点>点Y</終点><線情報><色>赤</色><線種>破線</線種><線太さ>普通</線太さ></線情報></要素>";
Element a = new Element( ss );
}
public Element( String s ){
//名前を取得する
String ss = this.getName(s);
if( ss==null ){ name = "" ; param = s; }else{
//名前タグを外した残りをタグ配列に分割する
String[] sss = this.getTags( ss );
if(sss==null){
//タグがなければ文字列をparamに入れる
param = ss;
}else{
//タグをatai配列に入れる
element = new Element[ sss.length ];
for(int i=0;i<sss.length;i++){ element[i] = new Element( sss[i] ); }
}
System.out.print( "名前:" + name + " 定義値:" + param );
if(sss!=null){
System.out.print( "子タグ:" );
for(int i=0;i<sss.length;i++){ System.out.print( sss[i] + " , " ); }
}
System.out.println( "" );
}
}
private String[] getTags( String s ){
Vector v = new Vector();
boolean flug=true;
do{
String[] ss = this.getTag(s);
if(ss==null){
flug = false;
} else{
v.add( ss[0] );
s = ss[1];
}
}while(flug);
if(v.size()==0){ return null; }
String[] rs = new String[ v.size() ] ;
for(int i=0;i<v.size();i++){ rs[i] = (String)v.get(i); }
return rs;
}
/**文字列から1つのタグを取り出し、取り出したタグと残りの文字列を返す*/
private String[] getTag( String s ){
String rt = null;
String lt = null;
String tagname = this.getFastTagName(s);
if( tagname != null ){
int st = s.indexOf( "<" + tagname + ">" );
int et = s.indexOf( "</" + tagname + ">" );
rt = s.substring( st , et + tagname.length()+3 );
lt = s.substring( et + tagname.length()+3 );
}
if(rt==null){ return null; }
return new String[]{ rt , lt };
}
/**nameに値を入れる。Nameタグを外した文字列を返す
* */
private String getName( String s ){
name = this.getFastTagName(s);
if(name == null){return null;}
int st = s.indexOf( "<" + name + ">" );
int et = s.lastIndexOf( "</" + name + ">" );
String rs = s.substring( st+name.length() + 2 , et );
return rs;
}
/**文字列に含まれている最初のタグの名前を返す*/
String getFastTagName( String s ){
int st = s.indexOf("<");
int et = s.indexOf(">");
if(st==-1){ return null ; }
if(et==-1){ return null ; }
if(st>et){ return null ; }
return s.substring( st+1 , et);
}
}
最終更新日: 2018-03-26 08:16:32