Error parsing XML: no element found
XMLファイルにおいて上記エラーが発生しました。
色々な解決方法がネットに掲載されています。
XMLファイルの内容には、文法上の誤りとかは、一切ありません。
私は、当該ファイルをsaveし、closeする(ファイルを閉じる)と、このエラーは発生しなくなりました。
全く意味が分からないエラーです。eclipseのバグかもしれません。
【開発環境】
OS:Windows Vista
Eclipse IDE for Java Developers Version: Indigo Release
2011年7月1日金曜日
2011年6月29日水曜日
Google CGI API for Japanese Input
/*
これは、
Google CGI API for Japanese Input(日本語変換をインターネット上で実現するための、CGI サービス)
をandroid上で学習・実験するプログラムです。
参考となるサイトは次のとおりです。
http://code.google.com/intl/ja/appengine/docs/java/urlfetch/usingjavanet.html
以下のsourceは、開発者がAPIを学習・実験するためのプログラムであり、デバッグを行いながら、内容を様々に書き換えて、各変数の内容を確認することを前提としている。
ユーザーインターフェイスは無い。 最終利用者が使うものでは無い。
学習・実験目的であるため、簡潔には書いていない。
Eclipseでandroidプロジェクトを新規生成した時に作成されるjavaファイルの内容を下記のとおり書き変えれば良い。
事前に、AndroidManifest.xmlファイルに次の一行を追記する必要がある。
<uses-permission android:name="android.permission.INTERNET" />
*/
package jp.Test.HTTPGet;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import org.json.JSONArray;
import org.json.JSONException;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public class HTTPGet extends Activity {
private final String sLogMes = "HTTPGet";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
URL url = null;
String sLines = "";
String s = "http://www.google.com/transliterate?langpair=ja-Hira|ja&text=";
//変換したい文字列を書き込む。UTF-8 でエンコードする。
s = s + Uri.encode("へんかん");
//s = s + Uri.encode("ここではきものをぬぐ");
try {//URL型に整形する。
url = new URL(s);
}
catch(MalformedURLException e){
Log.e(sLogMes, "URL Exception");
finish();
return;
}
try{//GETを発行し、データを受け取る。
InputStream is;
//GETを発行し、変換後のデータを受け取る。JSON 形式の配列が返されます。
is = url.openStream();
//後続のJSON処理のため、受け取ったデータをString型に変換する。
byte[] Buffer = new byte[1000];
is.read(Buffer, 0, 1000);
sLines = new String(Buffer);
}
catch(IOException e){
Log.e(sLogMes, "IO Exception");
finish();
return;
}
try{//JSON型で扱う。
int i, iArrays;
JSONArray aJSONMain, aJ1, aJ2;
aJSONMain = new JSONArray(sLines);//JSON型に変換する。
iArrays = aJSONMain.length();
for(i=0; i<iArrays; i++){
int i2, iA2;
//デバッガーで値を確認することが目的なので、何もしない。
aJ1 = aJSONMain.getJSONArray(i);
s = aJ1.getString(0);//第一要素 元の文字列
aJ2 = aJ1.getJSONArray(1);
iA2 = aJ2.length();
for(i2=0; i2<iA2; i2++){
s = aJ2.getString(i2);//第二要素 変換候補
}
}
}
catch(JSONException e){
Log.e(sLogMes, "JSON Exception");
finish();
return;
}
Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
}
}
後日談を、Google API Japanese Inputに書いておきました。
これは、
Google CGI API for Japanese Input(日本語変換をインターネット上で実現するための、CGI サービス)
をandroid上で学習・実験するプログラムです。
参考となるサイトは次のとおりです。
http://code.google.com/intl/ja/appengine/docs/java/urlfetch/usingjavanet.html
以下のsourceは、開発者がAPIを学習・実験するためのプログラムであり、デバッグを行いながら、内容を様々に書き換えて、各変数の内容を確認することを前提としている。
ユーザーインターフェイスは無い。 最終利用者が使うものでは無い。
学習・実験目的であるため、簡潔には書いていない。
Eclipseでandroidプロジェクトを新規生成した時に作成されるjavaファイルの内容を下記のとおり書き変えれば良い。
事前に、AndroidManifest.xmlファイルに次の一行を追記する必要がある。
<uses-permission android:name="android.permission.INTERNET" />
*/
package jp.Test.HTTPGet;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import org.json.JSONException;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public class HTTPGet extends Activity {
private final String sLogMes = "HTTPGet";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
URL url = null;
String sLines = "";
String s = "http://www.google.com/transliterate?langpair=ja-Hira|ja&text=";
//変換したい文字列を書き込む。UTF-8 でエンコードする。
s = s + Uri.encode("へんかん");
//s = s + Uri.encode("ここではきものをぬぐ");
try {//URL型に整形する。
url = new URL(s);
}
catch(MalformedURLException e){
Log.e(sLogMes, "URL Exception");
finish();
return;
}
try{//GETを発行し、データを受け取る。
InputStream is;
//GETを発行し、変換後のデータを受け取る。JSON 形式の配列が返されます。
is = url.openStream();
//後続のJSON処理のため、受け取ったデータをString型に変換する。
byte[] Buffer = new byte[1000];
is.read(Buffer, 0, 1000);
sLines = new String(Buffer);
}
catch(IOException e){
Log.e(sLogMes, "IO Exception");
finish();
return;
}
try{//JSON型で扱う。
int i, iArrays;
JSONArray aJSONMain, aJ1, aJ2;
aJSONMain = new JSONArray(sLines);//JSON型に変換する。
iArrays = aJSONMain.length();
for(i=0; i<iArrays; i++){
int i2, iA2;
//デバッガーで値を確認することが目的なので、何もしない。
aJ1 = aJSONMain.getJSONArray(i);
s = aJ1.getString(0);//第一要素 元の文字列
aJ2 = aJ1.getJSONArray(1);
iA2 = aJ2.length();
for(i2=0; i2<iA2; i2++){
s = aJ2.getString(i2);//第二要素 変換候補
}
}
}
catch(JSONException e){
Log.e(sLogMes, "JSON Exception");
finish();
return;
}
Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
}
}
後日談を、Google API Japanese Inputに書いておきました。
2011年6月23日木曜日
The declared package "jp.Hello" does not match the expected package ""
The declared package "jp.Hello" does not match the expected package ""
Eclipseを使っていて、良くある、誤った操作として、
不用意に、ファイルを別のディレクトリに移動させてしまう
という現象がある。
Eclipse画面の左側に「Package Explorer」欄(又は「Navigator」欄)があるが、そこのファイルを操作すると、意図しないのに、ファイルを別のディレクトリに移動させてしまう。操作者は意図していないため、ファイルが移動したことに気が付かない。そのため、上記のような、エラーが発生する。
「Package Explorer」欄では、(default package)ディレクトリがあり、そこにjavaファイルが存在する。
このjavaファイルを元のディレクトリに移動してやれば問題は解決する。
意味不明なエラーメッセージが出たら、ファイル構成を確認することも必要である。
Eclipseを使っていて、良くある、誤った操作として、
不用意に、ファイルを別のディレクトリに移動させてしまう
という現象がある。
Eclipse画面の左側に「Package Explorer」欄(又は「Navigator」欄)があるが、そこのファイルを操作すると、意図しないのに、ファイルを別のディレクトリに移動させてしまう。操作者は意図していないため、ファイルが移動したことに気が付かない。そのため、上記のような、エラーが発生する。
「Package Explorer」欄では、(default package)ディレクトリがあり、そこにjavaファイルが存在する。
このjavaファイルを元のディレクトリに移動してやれば問題は解決する。
意味不明なエラーメッセージが出たら、ファイル構成を確認することも必要である。
この問題の解決に結構時間がかかってしまった。残念です。
「Navigator」欄と「Package Explorer」欄の違いが不明である、という疑問を念を抱きながら、本日のレクチャーを終わりたい。
2011年6月1日水曜日
Internal error logged from JDI Debug
Internal error logged from JDI Debug
【再現方法】
デバッグモードでアプリケーションを起動する。
「Waiting For Debugger」というメッセージwindowが出たら、そのwindowの中にある「Force Close」を押す。
なお、このWindowは放っておけば自然に消滅する。
【解決方法】
上記windowが表示されても、「Force Close」ボタンを押さずに、そのwindowが自然消滅するまで、そのまま待つ。
【開発環境】
OS:Windows Vista
Eclipse IDE for Java Developers Helios Service Release 2
【再現方法】
デバッグモードでアプリケーションを起動する。
「Waiting For Debugger」というメッセージwindowが出たら、そのwindowの中にある「Force Close」を押す。
なお、このWindowは放っておけば自然に消滅する。
【解決方法】
上記windowが表示されても、「Force Close」ボタンを押さずに、そのwindowが自然消滅するまで、そのまま待つ。
【開発環境】
OS:Windows Vista
Eclipse IDE for Java Developers Helios Service Release 2
2011年5月25日水曜日
ラップwrapとは何か
wrapとは、包むという意味である。
保存のために、ビニールで食料品を包む行為を想像すれば良い。
食料品をビニールで包んだ場合、それを触ると、食料品を直接触るのではなく、外側のビニールを触ったことになる。これにより、食料品は傷まない。そして、食料品を持ち運ぶことができる。ボールとして取扱えば、キャッチボールすらできてしまう。そんないろいろなメリットがある。
食べることができないというデメリットはあるが、ここでは考えない。
ラップをすることにより取扱いが容易になり、安全性が向上するのである。
ラップやラッパーという用語があいまいになったら、以上のことを想像すれば良い。
さて、文字列データ群と、その文字列の属性データ群とが、存在するとしよう。
この2個の各々のデータを各々の格納先から持ってくるという手法は、昔から行われてきた手法である。
そうするよりも、文字列データとその属性データとを一個のクラスの中に入れてしまって、メソッドを使い操作すれば、取扱いが容易になる。
クラスに格納するという手間、つまりラッピングするという手間はかかるが、その後の取り扱いは安全で容易になるのである。
この機能を担うクラスをwrapperという。
なお、音楽は、rap musicであって、それをやってる人をrapperという。こっちを想像して踊りだしたりするのは良くない。
保存のために、ビニールで食料品を包む行為を想像すれば良い。
食料品をビニールで包んだ場合、それを触ると、食料品を直接触るのではなく、外側のビニールを触ったことになる。これにより、食料品は傷まない。そして、食料品を持ち運ぶことができる。ボールとして取扱えば、キャッチボールすらできてしまう。そんないろいろなメリットがある。
食べることができないというデメリットはあるが、ここでは考えない。
ラップをすることにより取扱いが容易になり、安全性が向上するのである。
ラップやラッパーという用語があいまいになったら、以上のことを想像すれば良い。
さて、文字列データ群と、その文字列の属性データ群とが、存在するとしよう。
この2個の各々のデータを各々の格納先から持ってくるという手法は、昔から行われてきた手法である。
そうするよりも、文字列データとその属性データとを一個のクラスの中に入れてしまって、メソッドを使い操作すれば、取扱いが容易になる。
クラスに格納するという手間、つまりラッピングするという手間はかかるが、その後の取り扱いは安全で容易になるのである。
この機能を担うクラスをwrapperという。
なお、音楽は、rap musicであって、それをやってる人をrapperという。こっちを想像して踊りだしたりするのは良くない。
2011年5月12日木曜日
No grammar constraints (DTD or XML schema) detected for the document
No grammar constraints (DTD or XML schema) detected for the document
この警告に対する適切な解決方法を見つけましたので報告します。
この警告に対する適切な解決方法を見つけましたので報告します。
- 上記警告が発生しているXMLファイルを開きます。
- Edit>Select All>Copyします。つまり、XMLデータの全てをClipboardに入れます。
- カーソルを第一行目の左端に持っていきます。
- エンターキーを適当な回数押します。
- すると、おかしなことに、警告のマークも下にズレていくことが観察されます。
- カーソルを第一行目の左端に持っていきます。
- Edit>Pasteします。
- このPasteコマンドで張り付けたデータよりも下にあるデータを全て削除します。
- すると、何故か警告マークも一緒に消えてしまいます。
- そして警告自体も消えます。
以上のことから、この警告はEclipseのバグだろうと思います。
About this warning, many other sites have explained to operate Validation command. But I feel that this method is not appropriate. I think I found a appropriate solution as follow:.
- Open the file that issued the warning as such above.
- Operate Edit>Select All>Copy. In other words, copy all XML data into the Clipboard.
- Move the cursor to the left of the first line.
- Press the Enter key a few times.
- Then, oddly enough, we observe that the warning mark is going down.
- Move the cursor to the left of the first line.
- Operate Edit>Paste
- Delete all the data that is at lower position than the data that was pasted
- Then, somehow, the warning mark is lost.
- And then a warning itself will disappear also.
In conclusion, I think Eclipse bug caused this warning.
2011年5月6日金曜日
android:idについて
android:idについて
XMLに書かれているandroid:id、例えば、
android:id="@+id/gridview"
に関して
android developersのDeclaring Layoutの記事は分かりにくい。そこで、私なりにまとめてみる。
Viewは階層構造をしています。このため、この階層構造は「木、ツリー」(tree)とも表現されたりします。
個々のViewは、個々にIDを持っています。これは個々のViewを識別するためです。
しかし、プログラマは、全てのViewにIDを与えるコードを書く必要はありません。プログラム内で識別を必要とするViewに対してだけ、意図的にIDを付与すれば良いのです。例えば、多くの場合、LinearLayout等のViewGroupにIDを付与する必要性は無いでしょう。
IDはXMLファイル内では通常は文字列として書きます。例えば、次のように。
android:id="@+id/gridview"
このIDは、コンパイルされた場合、整数として参照されます。この整数値の所在は、(コンパイルされた後で)R.javaファイル内に記されています。このファイルの所在は次のとおりです。
/(プロジェクトのルートフォルダー)/gen/(フォルダー)/R.java
実際には、プログラマーは、R.javaを直接操作したり、見たりはしません。無視しておけば良いです。
XMLにおいてIDの表記の仕方は、既に示したように、次のようになります。
android:id="@+id/my_button"
文字列内のデータが@で始まっている場合、その(@で始まる)文字列をリソースのIDとして解釈します。
+記号がある場合、それは、R.javaファイルに、当該データを「作成する」ことを指示します。
既に作成されてあるデータを参照する場合には、次のように、+記号を付けずに書きます。
android:id="@id/my_button"
例えば、次のような書き方もあります。
android:id="@android:id/empty"
これは、"android"というパッケージネームスペースを使って、android.RリソースクラスからIDを参照します。これはローカルにある、resフォルダーのリソースを参照するものではありません。
XMLに書かれているandroid:id、例えば、
android:id="@+id/gridview"
に関して
android developersのDeclaring Layoutの記事は分かりにくい。そこで、私なりにまとめてみる。
Viewは階層構造をしています。このため、この階層構造は「木、ツリー」(tree)とも表現されたりします。
個々のViewは、個々にIDを持っています。これは個々のViewを識別するためです。
しかし、プログラマは、全てのViewにIDを与えるコードを書く必要はありません。プログラム内で識別を必要とするViewに対してだけ、意図的にIDを付与すれば良いのです。例えば、多くの場合、LinearLayout等のViewGroupにIDを付与する必要性は無いでしょう。
IDはXMLファイル内では通常は文字列として書きます。例えば、次のように。
android:id="@+id/gridview"
このIDは、コンパイルされた場合、整数として参照されます。この整数値の所在は、(コンパイルされた後で)R.javaファイル内に記されています。このファイルの所在は次のとおりです。
/(プロジェクトのルートフォルダー)/gen/(フォルダー)/R.java
実際には、プログラマーは、R.javaを直接操作したり、見たりはしません。無視しておけば良いです。
XMLにおいてIDの表記の仕方は、既に示したように、次のようになります。
android:id="@+id/my_button"
文字列内のデータが@で始まっている場合、その(@で始まる)文字列をリソースのIDとして解釈します。
+記号がある場合、それは、R.javaファイルに、当該データを「作成する」ことを指示します。
既に作成されてあるデータを参照する場合には、次のように、+記号を付けずに書きます。
android:id="@id/my_button"
例えば、次のような書き方もあります。
android:id="@android:id/empty"
これは、"android"というパッケージネームスペースを使って、android.RリソースクラスからIDを参照します。これはローカルにある、resフォルダーのリソースを参照するものではありません。
登録:
投稿 (Atom)