テキストデータの書式といえば、JSONが流行っていると思う。
CSV、XMLもあり、一時テキスト通信データの書式としてXMLが流行っていた時期もあったが、現在は大体JSONになっている。
JSONは言語に依存しないデーター形式がいいらしい。
JSONもいいけど個人的には単純なXMLの方がわかりやすく、扱いやすいから好きだ。
といっても、既存のXMLだと、扱いずらい、いろいろなオプションや拡張や決りが多くて
正式なXMLとして読み取るとなると、書式エラーでNGとなったり、いろいろできることはいいと思うが
かえってわかりずらくなってしまっている。
単純に<xxx>内容</xxx>で囲まれているという規則で、同じ名称の項目の場合上書きされるというだけの
単純XMLで他の規則は無視するとテキストデータとしては
JSONより個人的には優れている気がするし、大体の言語で数十行で対応できるようなテキストデーター書式になるのではと思われる。
データによっては欠点もあるが、それは、他の方式でもあるし、コード変更で対応もできる。
■PHPの場合の例
function fnc_xmlget($xml,$colnm){
return fnc_tagcut($xml,'<'.$colnm.'>','</'.$colnm.'>');
}
function fnc_xmlset($xml,$colnm,$setvalue){
if ($colnm=='')return '';
$xml=str_replace('</data>','',$xml);
$xml=trim($xml);
if (strpos('_'.$xml,'<data>')!=1)$xml='<data>'."\n";
$ck=fnc_xmlget($xml,$colnm);
$xml=str_replace('<'.$colnm.'>'.$ck.'</'.$colnm.'>','',$xml);
$setvalue=($setvalue);
if ($setvalue!=''){
$xml=trim($xml);
$setvalue=str_replace('<','<',$setvalue);
$setvalue=str_replace('>','>',$setvalue);
$xml.="\n<".$colnm.'>'.$setvalue."</".$colnm.'>';
}
$xml.="\n</data>";
return $xml;
}
function fnc_tagcut($moto,$startstr,$endstr){
$ret='';
$eind=0;
$sind=strpos('_'.$moto,$startstr);
if ($sind>0){
$moto2=substr($moto,$sind+strlen($startstr));
$eind=strpos('_'.$moto2,$endstr);
}
if ($sind>0 && $eind>0){
$ret=substr($moto,($sind-1),($eind+strlen($startstr)));
$ret=substr($ret,strlen($startstr));
}else{
$ret='';
}
return $ret;
}
■Javascriptの場合の例
function fnc_xmlset(xml,colnm,setvalue){
if (colnm==''){ return ''; }
xml=fnc_okikae(xml,'</data>','');
xml=fnc_trim(xml);
if (('_'+xml).indexOf('<data>')!=1)xml='<data>';
var ck=fnc_getxmldata(colnm,xml);
xml=fnc_okikae(xml,'<'+colnm+'>'+ck+'</'+colnm+'>','');
setvalue=fnc_trim(setvalue);
if (setvalue!=''){
xml=fnc_trim(xml);
xml+="<"+colnm+'>'+setvalue+"</"+colnm+'>';
}
xml+='</data>';
return xml;
}
function fnc_getxmldata(nm,xml){
var startstr='<'+nm+'>';
var endstr='</'+nm+'>';
var ret='';
var eind=0;
var sind=xml.indexOf(startstr);
if (sind>0){
var xml2=xml.substring(sind+startstr.length);
var eind=xml2.indexOf(endstr);
}
if (sind>0 && eind>0){
ret=xml2.substring(0,eind);
}
return ret;
}
function fnc_okikae(str,mae,ato){
for(i=0;i<1000;i++){
str=str.replace(mae, ato);
if (str.indexOf(mae)<0){
i=1001;
}
}
return str;
}
■javaの場合(読み取りのみだが、書き込みも上のような感じですぐつくれるはず)
public String fnc_xmlget(String xml,String colname){
return fnc_tagcut(xml,"<"+colname+">","</"+colname+">");
}
public String fnc_tagcut(String strMoto,String strStart,String strEnd){
String ret="";
int intEnd=0;
int intStart = (strMoto.indexOf(strStart)+1);
String strTmp = "";
if (intStart > 0 && strStart.length()>0 && strEnd.length()>0){
strTmp = this.fnc_substr(strMoto,(intStart + strStart.length()));
intEnd = (strTmp.indexOf(strEnd))+1;
}
if (intStart > 0 && intEnd > 0){
ret=fnc_substr(strMoto,(intStart - 1),(intEnd + strStart.length()));
ret=fnc_substr(ret,strStart.length());
}
return ret;
}
■swift(読み取りのみだが、書き込みも上のような感じですぐつくれるはず)
func fnc_xmlget(xml: String,colname: String) -> String {
return fnc_tagcut(strMoto: xml, strStart: "<" + colname + ">", strEnd: "</" + colname + ">")
}
func fnc_tagcut(strMoto: String,strStart: String,strEnd: String) -> String {
var ret = "" as String
var intEnd = 0 as Int
let intStart = (fnc_indexOf(strMoto: strMoto, strKwd: strStart) + 1) as Int
var strTmp = "" as String
if (intStart > 0 && strStart.count > 0 && strEnd.count > 0){
strTmp = fnc_substr(strMoto: strMoto, intStart: (intStart + strStart.count), intLen: 0)
intEnd = (fnc_indexOf(strMoto: strTmp, strKwd: strEnd) + 1)
}
if (intStart > 0 && intEnd > 0){
ret = fnc_substr(strMoto: strMoto, intStart: (intStart - 1), intLen: (intEnd + strStart.count))
ret = fnc_substr(strMoto: ret, intStart: strStart.count, intLen: 0)
}
return ret
}