質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Q&A

解決済

2回答

505閲覧

xmlの処理がうまくいかず.出力結果が表示されない.

studyprg

総合スコア57

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

0グッド

0クリップ

投稿2022/06/16 06:00

編集2022/06/17 05:59

自然言語処理について勉強しています。
Wikipediaのdumpデータ(xml)から本文を抜き出して処理をしようと思ってます。
xmlの処理について試しているのですが、出力結果が出なくて困っています。
欲しい出力は3つです.
1,,<text></text>の開始ポイントとバイト数.
2.<title></title>の開始ポイントとバイト数.
3.<id></id>の開始ポイントとバイト数.
コンパイルは通りますが,実行しても秒で終了し,何も出力されません.
プログラミングはあまり得意ではないです。

以下にソースコードを貼り付けます。

wiki_getter1_byte.c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5int main() 6{ 7 8 size_t p, pb[3]; 9 char line[BUFSIZ]; 10 char title[BUFSIZ]; 11 char idnum[BUFSIZ]; 12 char startw[] = "<text";//ここと一つ下ををtitleやidに変えて実行したい 13 char endw[] = "</text>"; 14 char nextw[] = "</page>"; 15 char *readfilename = "jawiki-20211220-pages-articles-multistream2.xml"; //読み込むファイル 16 char *writefilename = "wiki_byte1.txt"; //書き込むファイル 17 18 FILE *fp = fopen(readfilename, "r"); 19 FILE *fw = fopen(writefilename, "w"); 20 if ((NULL == fp) || (NULL == fw)) 21 abort(); 22 else{ 23 printf("ファイル開きます"); 24 } 25 while (p = ftell(fp), fgets(line, BUFSIZ, fp)) 26 { 27 28 if (strstr(line, startw)) 29 pb[0] = p; 30 else if (strstr(line, endw)) 31 { 32 pb[1] = p - pb[0]; 33 printf("%zu\t%zu\n", pb[0], pb[1]);//欲しい出力 34 strstr(line, nextw);//revisionの下の<id>を読み込まないため 35 // fprintf(fw, "%zu\t%zu\n", pb[0], pb[1]); // ...書き込み用, 36 // fprintf(fw, "%d\t%d\n", pb[0], pb[1]); ... 37 } 38 fclose(fw); 39 fclose(fp); 40 } 41} 42 43

実行時はファイル読み込みは出ているようです.
欲しい部分の理解用にwikiのxmlファイルの一例を示します.

<page> <title>鳥取砂丘</title> <ns>0</ns> <id>19812</id> <revision> <id>53717095</id> <parentid>53211643</parentid> <timestamp>2014-12-06T03:46:16Z</timestamp> <contributor> <ip>58.156.158.18</ip> </contributor> <comment>/* 砂丘の利用と周辺住民とのかかわり */</comment> <model>wikitext</model> <format>text/x-wiki</format> <text xml:space="preserve">{{Coord|35|32|27.821|N|134|13|41.789|E|region:JP|display=title}} [[ファイル:Tottori-Sakyu Tottori Japan.JPG|thumb|300px|馬の背]] {{mapplot|134.2290|35.5407|鳥取砂丘}} '''鳥取砂丘'''(とっとりさきゅう)は、[[鳥取県]][[鳥取市]]の[[日本海]]海岸に広がる広大な砂礫地で、代表的な[[海岸砂丘]]。日本三大砂丘の1つである&lt;ref&gt;その他の2つについては、諸説ある。&lt;/ref&gt;。[[山陰海岸国立公園]]の特別保護地区に指定されており、南北2.4km、東西16kmに広がる日本最大の観光可能な[[砂丘]]である。(一般に立ち入れない物も含めると、日本最大の砂丘は&lt;!--(内陸にある砂丘を含めると--&gt;[[青森県]]の[[猿ヶ森砂丘]])。&lt;!--内陸砂丘は大陸内部の砂丘を示し、日本には内陸砂丘なないため編集しました--&gt; <中略> [[Category:日本の海岸景勝地]] [[Category:砂丘]] [[Category:平成百景]] [[Category:日本の地質百選]]</text> <sha1>axvz6j2vrmxe3n68ssg11m0w8qtcobn</sha1> </revision> </page>

追記:現在のソースを追記しておきます.

Wiki_parser1_Byte.c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#define SIZE 256 * 1024 * 1024 5 6int main() 7{ 8 9 size_t p, pb[2]; 10 char *line = malloc(SIZE); 11 FILE *fp = fopen("jawiki-20211220-pages-articles-multistream2.xml", "r"); 12 FILE *fw = fopen("get_text_byte.txt", "w"); 13 // printf(fw,"startbyte\t記事のbyte \n"); 14 if ((NULL == fp) || (NULL == fw)) 15 abort(); 16 while (p = ftell(fp), fgets(line, SIZE, fp)) 17 { 18 if (strstr(line, "<page>")) 19 { 20 pb[0] = p; 21 22 if (strstr(line, "</page>")) 23 { 24 pb[1] = p - pb[0]; 25 26 // fprintf(fw, "%zu\t%zu\n", pb[0], pb[1]); // ... 27 // fprintf(fw, "%d\t%d\n", pb[0], pb[1]); ... テキスト形式で観察可能 28 } 29 printf("%zu\t%zu\n", pb[0], pb[1]); 30 } 31 } 32 printf("process ok"); 33 free(line); 34 fclose(fw); 35 fclose(fp); 36}

現在の出力も載せておきます.

1536124776 0 1536146103 0 1536146845 0 1536147939 0 1536153955 0 1536159921 0 1536174339 0 1536177008 0 1536181947 0 1536187730 0 1536188261 0 1536205531 0 1536286862 0 1536292238 0 1536295216 0 1536302579 0 1536318555 0 process ok

処理自体は動いていますがバイト数が常に0です.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

studyprg

2022/06/16 07:47

一応ファイルは開いてるようです. その後すぐに処理が停止しているようです.
studyprg

2022/06/17 07:56

pb[1]=p-pb[0]を pb[1]=pとして観察しましたが既に記入していたものと同じくpb[1]は0でした.
guest

回答2

0

char startw[] = "<text>";

質問文のデータサンプルの中には <text> という文字列はありません。
<text xml:space="preserve"> があるので、これを見つけないといけないのでしょう。

投稿2022/06/16 06:15

int32_t

総合スコア20884

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2022/06/16 06:26 編集

XMLパーサ使えばいいのに(二度目) # この程度なら単純なSAXパーサで十分ぢゃろ...
episteme

2022/06/16 07:27

> <textですね それに続く '>' を見つけないと <text ....> に続く文字列を取り出せません。まぁがんばって。
dodox86

2022/06/16 08:39

xmlをちゃんと意識すると、終了タグのある<text 属性...>内容</text>のような場合もあれば、終了タグの無い<text 属性... />のような形式もまぁ、考えられなくは無いので自力でちゃんと対応するのは勉強にはなるけど大変でしょうね。
studyprg

2022/06/16 09:01

ありがとうございます。 頑張ります
guest

0

自己解決

別の方向にすることにしました.

投稿2022/06/19 08:50

studyprg

総合スコア57

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問