狠狠撸

狠狠撸Share a Scribd company logo
parser 入門
~使ってみようlibxml2~
Knct-SG #1
@y1r96

1
parser is なに

2
parserとは
?

parse (動詞)?
文法に従って分析する、品詞を記述する、構文
解析する、などの意味を持つ英単語。プログラ
ムのソースコードやXML文書など、一定の文法
に従って記述された複雑な構造のテキスト文書
を解析し、プログラムで扱えるようなデータ構
造の集合体に変換することなどを指す。

?

parserはこのparseをするもの
3
???

4
json(後述),HTML,XMLなどを?
コンピュータで扱いやすいデータ構造に変換する

5
使用例
?

Twitter Client ( json parserが入ってる )

?

Web Browser ( HTML parserが入ってる )

?

etc...

6
json? HTML?

7
json

?

json( JavaScript Object Notation )

?

JavaScriptにおけるオブジェクトの表記法を
ベースとした軽量なデータ記述言語

8
jsonを見てみよう

9
10
parseする #とは

11
parse しよう
例えばPHP
$jset = json_decode($json);
↓
echo $jset[ search_metadata ][ count ];
↓
10
12
13
_人人人人人_
>?すごい?<
 ̄Y^Y^Y^Y ̄

14
Parserの種類

?

DOM (Document Object Model) API

?

SAX (Simple API for XML)

15
DOM API
?

Document Object Model をつくる

?

さっきのやつ

?

全体をparseして、あとから要素にaccessする

?

全体のツリー構造を作るのでメモリを食う

?

複雑な動作を実行しやすい
16
SAX
?

Simple API for XML

?

最初から順番にparseし、?
要素を見つけるたびに処理を行う

?

省メモリ

?

複雑な操作を実行しにくい
17
代表的なparser実装
?

HTML,XML Parser libxml2 (C言語で実装)

?

色々な言語の標準ライブラリに既に実装済
?

JavaScript JSON.parse()

?

PHP json_decode()

?

etc...
18
parserでできること

19
parserでできること
?

要素を書き出し?
libxml2ならxmlSaveFormatFile()とかでできる
?

?

DOMツリーを書き換えて、?
元のXMLに上書き保存

etc...

20
libxml2をつかってみよう

21
libxml2
↓
HTMLをparse
↓
<a href= hoge >foo</a>?
のhogeとfooを抜き出す

22
動かしてみよう

23
?

curl www.yahoo.co.jp -o index.html

?

gcc getURLbyHTML.c -I/usr/local/opt/
libxml2/include/libxml2 -lxml2

?

./a.out index.html

24
raw.github.com/y1r/Knct-SG/master/1/y1r/getURLbyHTML.c

25
libxml/tree.h
struct _xmlDoc {
void
*_private;/*
xmlElementType type;
char
*name;
/*
struct _xmlNode *children;
struct _xmlNode *last;
/*
struct _xmlNode *parent; /*
struct _xmlNode *next;
/*
struct _xmlNode *prev;
/*
struct _xmlDoc *doc;
/*

!

};

application data */
/* XML_DOCUMENT_NODE, must be second ! */
name/filename/URI of the document */
/* the document tree */
last child link */
child->parent link */
next sibling link */
previous sibling link */
autoreference to itself */

/* End of common part */
int
compression;/* level of zlib compression */
int
standalone; /* standalone document (no external refs)
1 if standalone="yes"
0 if standalone="no"
-1 if there is no XML declaration
-2 if there is an XML declaration, but no
standalone attribute was specified */
struct _xmlDtd *intSubset; /* the document internal subset */
struct _xmlDtd *extSubset; /* the document external subset */
struct _xmlNs
*oldNs; /* Global namespace, the old way */
const xmlChar *version; /* the XML version string */
const xmlChar *encoding;
/* external initial encoding, if any */
void
*ids;
/* Hash table for ID attributes if any */
void
*refs;
/* Hash table for IDREFs attributes if any */
const xmlChar *URL; /* The URI for that document */
int
charset;
/* encoding of the in-memory content
actually an xmlCharEncoding */
struct _xmlDict *dict;
/* dict used to allocate names or NULL */
void
*psvi;
/* for type/PSVI informations */
int
parseFlags; /* set of xmlParserOption used to parse the
document */
int
properties; /* set of xmlDocProperties for this document
set at the end of parsing */
26
libxml/tree.h
typedef struct _xmlNode xmlNode;
typedef xmlNode *xmlNodePtr;
struct _xmlNode {
void
*_private; /* application data */
xmlElementType
type; /* type number, must be second ! */
const xmlChar
*name;
/* the name of the node, or the entity */
struct _xmlNode *children; /* parent->childs link */
struct _xmlNode *last; /* last child link */
struct _xmlNode *parent; /* child->parent link */
struct _xmlNode *next; /* next sibling link */
struct _xmlNode *prev; /* previous sibling link */
struct _xmlDoc *doc; /* the containing document */
!

/* End of common part */
xmlNs
*ns;
/* pointer to the associated namespace */
xmlChar
*content;
/* the content */
struct _xmlAttr *properties;/* properties list */
xmlNs
*nsDef;
/* namespace definitions on this node */
void
*psvi; /* for type/PSVI informations */
unsigned short
line; /* line number */
unsigned short
extra; /* extra data for XPath/XSLT */
};
27
libxml/xpath.h
typedef struct _xmlXPathObject xmlXPathObject;
typedef xmlXPathObject *xmlXPathObjectPtr;
struct _xmlXPathObject {
xmlXPathObjectType type;
xmlNodeSetPtr nodesetval;
int boolval;
double floatval;
xmlChar *stringval;
void *user;
int index;
void *user2;
int index2;
};
28
libxml/xpath.h
struct _xmlXPathContext {
xmlDocPtr doc;
xmlNodePtr node;

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

};

/* The current document */
/* The current node */

int nb_variables_unused;
int max_variables_unused;
xmlHashTablePtr varHash;

/* unused (hash table) */
/* unused (hash table) */
/* Hash table of defined variables */

int nb_types;
int max_types;
xmlXPathTypePtr types;

/* number of defined types */
/* max number of types */
/* Array of defined types */

int nb_funcs_unused;
int max_funcs_unused;
xmlHashTablePtr funcHash;

/* unused (hash table) */
/* unused (hash table) */
/* Hash table of defined funcs */

int nb_axis;
int max_axis;
xmlXPathAxisPtr axis;

/* number of defined axis */
/* max number of axis */
/* Array of defined axis */

/* the namespace nodes of the context node */
xmlNsPtr *namespaces;
/* Array of namespaces */
int nsNr;
/* number of namespace in scope */
void *user;
/* function to free */
/* extra variables */
int contextSize;
int proximityPosition;

/* the context size */
/* the proximity position */

/* extra stuff for XPointer */
int xptr;
xmlNodePtr here;
xmlNodePtr origin;

/* is this an XPointer context? */
/* for here() */
/* for origin() */

/* the set of namespace declarations in scope for the expression */
xmlHashTablePtr nsHash;
/* The namespaces hash table */
xmlXPathVariableLookupFunc varLookupFunc;/* variable lookup func */
void *varLookupData;
/* variable lookup data */
/* Possibility to link in an extra item */
void *extra;
/* needed for XSLT */
/* The function name and URI when calling a function */
const xmlChar *function;
const xmlChar *functionURI;
/* function lookup function and data */
xmlXPathFuncLookupFunc funcLookupFunc;/* function lookup func */
void *funcLookupData;
/* function lookup data */
/* temporary namespace lists kept for walking the namespace axis */
xmlNsPtr *tmpNsList;
/* Array of namespaces */
int tmpNsNr;
/* number of namespaces in scope */
/* error reporting mechanism */
void *userData;
/* user specific data block */
xmlStructuredErrorFunc error;
/* the callback in case of errors */
xmlError lastError;
/* the last error */
xmlNodePtr debugNode;
/* the source node XSLT */
/* dictionary */
xmlDictPtr dict;

/* dictionary if any */

int flags;

/* flags to control compilation */

/* Cache for reusal of XPath objects */
void *cache;

29
xmlChar *
?

libxml2で用いられる文字

?

typedef char xmlChar

?

UTF-8であることを明示的に示すため?

30
参考
?

Libxml Tutorial?
http://xmlsoft.org/tutorial/index.html

?

libxml2チュートリアル?
http://wiki.livedoor.jp/koba24505/d/
libxml2%A5%C1%A5%E5%A1%BC%A5%C8
%A5%EA%A5%A2%A5%EB

31
Knct-SG #2
未定

More Related Content

Knct-SG #1 Parser入門