• ベストアンサー

XML(HTML)の処理について

じゃば初心者です。 WEB上のXML(HTML)をとってきて、一部だけを取得するプログラムを作りたいのですがうまくいきません。 SAXParserのメソッドに parser(InputStream obj) | Parser(URI uri) があります。 初めはParser(URI uri)でURLを直接指定したのですが、プロキシを通すことができないみたいでできませんでした。 parser(InputStream obj) の java.io.InputStream は HttpURLConnection のgetInputStream()メソッドから取ってくるようにしました。これでwww.yahoo.comなどのサイトで初めのタイトルとかは取得できるようにはなったのですが、途中で例外が出てとまってしまいます。これは文字コードがUnicodeでないことが理由の一つだと思います。 InputStreamの文字コードを変換するか、ほかのよい方法を教えてください。

  • qutto
  • お礼率48% (40/83)
  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • watapen
  • ベストアンサー率10% (5/48)
回答No.1

はじめまして。 SAXPerserを掛けるときはXMLの文法にそったものしかだめですよね?落ちてしまうのは<BR>タグや<??? nowrap>とかのせいではないでしょうか? 一度ローカルファイルに落として文法チェックをしてからXML形式に修正してからParseしたらどうでしょうか?

その他の回答 (1)

  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.2

#01です。 でも著作権等には十分留意してくださいね。 Web上の著作権ってややこしいですからね。 ブラウザを作ってるというなら問題無いと思うんですけど、 データを加工するとなると、ちょっと問題になるかもしれません。

関連するQ&A

  • ActiveXObjectで取得したXMLの解析処理ができない

    Ajaxの勉強をしているのですが困っています。 ActiveXObjectで取得したXMLの解析処理ができないのです。 1.JavaScriptで新たにActiveXObjectのオブジェクトを作成 (例)var obj = ActiveXObject(Msxml2.XMLHTTP); 2.上記オブジェクトに対しopen(),send()を行う。 (例)obj.open(callback,url,false); 3.サーバーにてリクエスト受信後、JSP上に記述したXMLを送信。 4.上記オブジェクトに対しresponseXMLを行う。 (例)var doc = obj.responseXML; 5.XMLの要素を取得 (例)doc.getElementsByTagName("name"); 4の結果何らかのオブジェクトは取れているようなのです(alertで表示してみると"[Object]"と表示される。)が、実際に5でXML中の要素を取ろうとすると何も取得できません。一方4をobj.responseText;とすると、(alertで表示してみると文字化けしていますがXMLの)内容が取得できます。 なぜレスポンスをXMLにして取得した場合、情報を取得できないのでしょうか?ご教授いただけませんでしょうか? よろしくお願いいたします。

    • 締切済み
    • PHP
  • xml_parse_into_structでなぜか0が返ります

    http://iac-npo.de-blog.jp/yamazaki/atom.xml 上記のアドレスは、あるプロ野球選手のブログのRSSです(atom形式)。 これをxml_parse_into_structを使い、配列構造体に格納しようと考えています。 しかし、なぜか返り値は0。配列は当然カラです。 XMLについては文字コードはUTF8ですし、構造もきちんとしているように見えます。 何が原因なのでしょうか? ソースは以下の通りです。 $content=file_get_contents('http://iac-npo.de-blog.jp/yamazaki/atom.xml'); $xml_parser=xml_parser_create(); xml_parse_into_struct($xml_parser,$content,$vals); xml_parser_free($xml_parser);

    • ベストアンサー
    • PHP
  • Socket + XML

    ・クライアントはサーバへXML形式のクエリを送信し、 ・サーバからXML形式のデータを受け取る という単純なプログラムを実装しています。 しかしサーバ側の、InputStreamを引数とするXMLパースメソッドでwaitしてしまって困っています。 かといって、クライアント側のOutputStreamを閉じると、クライアントのソケット自体も閉じてしまいます。 なるべく一度のコネクションで送受信を終了させたいのですが、よい方法はないでしょうか? 一応、BufferedReaderを利用してXML文章を文字列に落としてから StringReaderをbuilder.parseの引数に与えることで解決出来てはいるのですがスマートではない気がしまして。 [Server側]  ServerSocket server_sock = new ServerSocket(12345);  Socket sock = server_sock.accept();  /* XMLパーサビルダ生成 */  DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();  DocumentBuilder builder = fact.newDocumentBuilder();  /* ドキュメント docIn の解析 */  Document docIn = builder.parse(sock.getInputStream());//ここから動かない(clientがoutputを終了するまで待っている?)  (略)  /* 結果ドキュメント docOut の構築*/  Document docOut = builder.newDocument();  (略)  /* docOut 送信 */  TransformerFactory tfactory = TransformerFactory.newInstance();  Transformer transformer = tfactory.newTransformer();  transformer.transform(new DOMSource(docOut), new StreamResult(sock.getOutputStream()));  sock.getInputStream().close();  sock.getOutputStream().close();  sock.close(); [Client側]  Socket sock = new Socket("localhost", 12345);  /* XMLパーサビルダ生成 */  DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();  DocumentBuilder builder = fact.newDocumentBuilder();  /* クエリドキュメント docOut の構築*/  Document docOut = builder.newDocument();  (略)  /* docOut 送信 */  TransformerFactory tfactory = TransformerFactory.newInstance();  Transformer transformer = tfactory.newTransformer();  transformer.transform(new DOMSource(docOut), new StreamResult(sock.getOutputStream()));  sock.getOutputStream().flush();  //sock.getOutputSream().close();//これにすると、socketが閉じてしまう  /* 結果ドキュメント docIn の解析 */  Document docIn = builder.parse(sock.getInputStream());//サーバから結果が送信されないので、クライアントはここで停止  (略)

    • ベストアンサー
    • Java
  • DOMでパースしているXML全体の出力方法

    お世話になります。 JavaでDOMを使ってXML操作をしたいと考えております。 おおよそ、以下のソースでparseできるところまで確認できました。 DOMParser parser = new DOMParser(); parser.parse("XMLファイルパス"); Document doc = parser.getDocument(); 開発中なので、DOM操作した結果のXMLを随時コンソールやログに 出力させたいのですが、たとえばdoc.toString()してもnullとなり、 正常に出力されません。 以下のようにElementを取得すると正常にアクセスできていることは 確認しています。 Element rootEl = doc.getDocumentElement(); System.out.println(rootEl.getNodeName()); なお、DOMライブラリにはxercesを用いております。 Dom4jのAPIも見てみましたが、それらしいメソッドを見つけることが できていません。 簡単にXMLを出力できることが理想です。 一般的な方法、よくやる手法など、みなさんよりご教示頂きたいです。

    • ベストアンサー
    • Java
  • VBAでxmlから特定の文字を変数に入れたい

    VBAからXMLを取得したくて方法を検索し、以下のコードで何とか取得ができました。 Sub httpRequest() Dim HttpReq As MSXML2.XMLHTTP Dim DomDoc As MSXML2.DOMDocument Dim targetURL As String targetURI = "http://www.drk7.jp/weather/xml/14.xml" 'HTTP GET Set HttpReq = CreateObject("MSXML2.XMLHTTP") HttpReq.Open "GET", targetURI, False HttpReq.send (Null) 'XML PARSE Set DomDoc = CreateObject("MSXML2.DOMDocument") DomDoc.LoadXML (HttpReq.responseText) dumpDomDoc DomDoc.ChildNodes Set HttpReq = Nothing Set DomDoc = Nothing End Sub Sub dumpDomDoc(objNode) Dim obj For Each obj In objNode MsgBox obj.ParentNode.nodeName & " : " & obj.NodeValue If obj.HasChildNodes Then dumpDomDoc obj.ChildNodes End If Next End Sub このコードですと、読み込んだXMLを一行づつメッセージボックスに延々と表示するだけなのですが、 例えば行先のXMLファイルにある<description>と</description>に囲まれた部分だけを変数に格納するにはどのように記述すればよろしいのでしょうか? ググってはみましたが知識不足の為、解説も理解できず困っております。 大変お手数ですがご教示いただけますようお願いします。

  • [Perl]Shift-JISのXMLを解析する場

    行き詰まってしまったので教えて下さい。 <やりたいこと> とあるAPIからXMLファイルを取得し、解析して出力する、ということをやっているのですが、元のXMLがShift-JISでエンコーディングされており、これをUTF-8に変換して出力しようとしています。 <問題> XMLを取得して解析、取り出したいパラメータが出力できるようにはなったのですが、文字のエンコーディングが上手く行っていないためか、文字化けしてしまいます。 <元のXML> <?xml version="1.0" encoding="Shift_JIS"?>  <test>   <prod count=3>    <record>     <code>アイウエ</code>    </record>    <record>     <code>カキクケ-</code>    </record>    <record>     <code>ABC</code>    </record>   </prod>  </test> <XML解析用のコード> #!usr/bin/perl use utf8; use Encode qw/ from_to encode decode /; use Encode::Guess qw/ euc-jp shiftjis 7bit-jis /; use LWP::UserAgent; use XML::Simple; use Data::Dumper; #--XML取得部分省略 #--XMLはgetで$xmlに格納 $from = guess_encoding($xml)->name; &from_to($xml,$from,"utf8"); $XML::Simple::PREFFERRED_PARSER = 'XML::SAX::PurePerl'; $xs = new XML::Simple(); $ref = $xs->XMLin($xml); $xml =~ s/<\?.*\?>//; for($i=0;$i<=$#{$ref->{'test'}->{'prod'}->{'record'}};$i++){  $name = $ref->{'test'}->{'prod'}->{'record'}[$i]->{'code'}; $name = encode('utf-8',$name); print "$i : $name\n"; } <結果> 黒ダイヤに?文字で文字化けして出力される。 どなたか原因がお分かりになりますでしょうか。 よろしくお願いいたします。

  • C++を使った汎用性のあるXML変換プログラム

    現在WindowsXP,VC++2008,でXMLの変換プログラムを作っています。XMLのパーサはxerces3.0.1をビルドしました。 JAVAなら少々経験がありますが、C++は初めてです。 要望として、日本語以外のOSやLINUX類でもできるだけそのまま動かせるよう留意してほしいと言われたのですが、具体的にどうやって気をつければよいのか思案中です。 まず、テキストファイルを辞書として読み込むので、その文字コードとか問題になるのかなと思います。今はShift-jisで何の変換もなくUTF-8のXML変換ができていますが、xercesに変換関数があるからです(おそらく内部はUnicode)。LINUXにしたらeuc-jpだし、欧州だとまたちがうだろうから、どのように辞書を定義するのがよいのかわからなくて困っています。 文字コード変換ライブラリにICUというのがあるところまでは調べましたが、これをどう変換に活かせばos,言語環境に依存しにくいプログラムがつくれるのかよくわかりません。 あと、いろいろ検索していると、windows系でしか働かない関数やunix系のものとかもいろいろあるのですね。これら、どの関数が使えてどれがこっちでは使えないですとかの情報はどうやったら手に入るのでしょう?ひとつひとつの関数を検索するしかないでしょうか。 漠然とした疑問でほんとうに恐縮ですが、ご意見、参考サイトなどお持ちの方、どうぞ教えてください。

  • MSXMLで使用可能な文字コードの種類は?

    MSXMLパーサが解釈できる文字コードには何があるか、調査をしています。 XMLパーサであり、Microsoftの製品ですから、s-JIS、UTF-8、UTF-16は当然扱えると思いますが、その裏づけがほしいのです。また、他に使用可能なものとして、何があるのかも知りたく思います。 (できれば使用可能な文字コードの一覧があると助かるのですが・・・)

    • ベストアンサー
    • XML
  • Androidの非同期処理でネットワークエラー発生

    Androidから、AsyncTaskを使用してURLにアクセスし、 外部DBのMySQLから引っ張ってきたデータをXML形式に変換したものを 取得したいと思っています。 一通り処理を作成し、実験的にデータを取得してみたのですが、 問題なく取得できるものと、途中でNetworkOnMainThreadExceptionが発生するものが 出てきてしまいました。 具体的には、下記のようなテーブルのデータを全カラム分取得し、 XML形式に変換しています。 【取得に成功したテーブル】 カラム数:3 内訳:INT型→1カラム、VARCHAR型→2カラム 一度に取得するデータ数:7行 【取得に失敗するテーブル】 カラム数:22 内訳:INT型→7カラム、CARCHAR型→12カラム、    TEXT型→1カラム、DATETIME型→2カラム 一度に取得するデータ数:最大10行 NetworkOnMainThreadExceptionが発生するタイミングは、 XMLデータを取得したタイミングではなく、 取得したXMLをデータ格納用オブジェクトに入れて ArrayListに蓄積しているタイミングです。 データが取得できているテーブルもあるので、 AsyncTaskの使い方が間違っているわけではないと思うのですが NetworkOnMainThreadExceptionが発生する原因を調べてみても、 AsyncTaskを使っていないから、というものしか出てこないので、 原因がさっぱりわかりません。 AsyncTaskの使い方で何か間違っている箇所があるのか、 そもそもAsyncTaskで取得させるデータ量に制限があるのか、 何かの指定をすればうまくできるものなのか、 何か思い当たることがあれば、教えていただきたいと思っています。 【AsyncTaskをextendsした自作クラス】 public class AsyncXmlLoader extends AsyncTask<String, Integer, InputStream> { public interface AsyncCallback { void preExecute(); void postExecute(InputStream result); void progressUpdate(int progress); void cancel(); } private AsyncCallback asyncCallback = null; public AsyncXmlLoader(AsyncCallback asyncCallback) { this.asyncCallback = asyncCallback; } @Override protected void onPreExecute() { super.onPreExecute(); asyncCallback.preExecute(); } @Override protected void onProgressUpdate(Integer... progress) { super.onProgressUpdate(progress); asyncCallback.progressUpdate(progress[0]); } @Override protected void onPostExecute(InputStream result) { super.onPostExecute(result); asyncCallback.postExecute(result); } @Override protected void onCancelled() { super.onCancelled(); asyncCallback.cancel(); } @Override protected InputStream doInBackground(String... uri) { InputStream inputStream = null; try { // URLクラスのインスタンス作成 URL url = new URL(uri[0]); // コネクション接続 URLConnection connection = url.openConnection(); // ストリームを取得 inputStream = connection.getInputStream(); } catch (MalformedURLException e) { Log.e("AsyncXmlLoader", e); } catch (IOException e) { Log.e("AsyncXmlLoader", e); } catch (Exception e) { Log.e("AsyncXmlLoader", e); } return inputStream; } } 【実際にデータを取得している箇所】 public class MainActivity extends ActionBarActivity { private final String URL = "http://hoge.jp/test.php"; private TextView testTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // TextViewを取得 testTextView = (TextView)findViewById(R.id.textViewTest); // XMLからカテゴリデータを取得 AsyncXmlLoader xml = new AsyncXmlLoader(new AsyncXmlLoader.AsyncCallback() { // 実行前 public void preExecute() { } // 実行後 public void postExecute(InputStream result) { if (result == null) { Log.e("AsyncCallback", "データ取得失敗"); return; } // XMLのデータを取得して画面に表示 BufferedReader br = new BufferedReader(new InputStreamReader(result)); StringBuilder sb = new StringBuilder(); String line; try { while ((line = br.readLine()) != null) { sb.append(line); } } catch (IOException e) { Log.e("AsyncCallback", e); } testTextView.setText(sb.toString()); } // 実行中 public void progressUpdate(int progress) { } // キャンセル public void cancel() { } }); // 処理を実行 xml.execute(URL); } } お知恵を貸していただきたいと思います。 どうぞよろしくお願いいたします。

  • メモ帳で保存した日本語テキストや日本語XMLをJavaで読込、保存。メモ帳での保存文字コードはなにが推奨されるでしょうか?

     Windows9x系ではないWindowsVistaやXP、NT、2000のメモ帳(Unicodeのbig endianは保存できるがおそらくUnicodeのbig endianでのBOMなし保存不可。UTF-8は保存できるがUTF-8でのBOMなし(UTF-8N)の保存不可。Unicodeのlittle endianは保存できるが仕様なので言うまでもないがUnicodeのlittle endianでのBOMなし保存不可。)で保存した日本語テキストや日本語XMLをJavaで読込、保存。メモ帳での保存文字コードはなにが推奨されるでしょうか? やはりJavaのString型に近いUnicode big endianがよいのでしょうか? それともJava側で自動認識してくれるのでしょうか? XMLの場合は1行目でそのXMLファイルが使用している文字コードが何か宣言しますよね。 でもテキストファイルだと文字コードを宣言する場所がないみたいですし・・・(ここでの文字コードを宣言する場所としてはBOMは例外ですよ 念のため) 補足:メモ帳だとUnicode big endianで保存すると必ずBOMが付くみたいです。 メモ帳はLF改行が使えません。CR+LF改行のみ対応です。

    • ベストアンサー
    • Java

専門家に質問してみよう