¤³¤Î¥¦¥£¥­¤ÎÆɼԤˤʤë
¹¹¿·¾ðÊ󤬥᡼¥ë¤ÇÆϤ­¤Þ¤¹¡£
¤³¤Î¥¦¥£¥­¤ÎÆɼԤˤʤë
¥«¥Æ¥´¥ê¡¼
ºÇ¶á¹¹¿·¤·¤¿¥Ú¡¼¥¸
ºÇ¿·¥³¥á¥ó¥È
XML¥á¥â by stunning seo guys
XML¥á¥â by watch for this
Menu
¤³¤³¤Ï¼«Í³¤ËÊÔ½¸¤Ç¤­¤ë¥¨¥ê¥¢¤Ç¤¹¡£

libxml2¥Á¥å¡¼¥È¥ê¥¢¥ë

Libxml Tutorial
John Fleck <jfleck@inkstain.net>
Copyright © 2002, 2003 John Fleck



£±¡¥½øʸ
Libxml¤Ï¡¢XML¥Ç¡¼¥¿¤ò²òÆɤ·¡¢ºîÀ®¤·¡¢Áàºî¤¹¤ë¤¿¤á¤Î¡¢C¸À¸ì¥é¥¤¥Ö¥é¥ê¤Ç¤¹¡£¤³¤Î¥Á¥å¡¼¥È¥ê¥¢¥ë¤Ï¥³¡¼¥ÉÎã¤È¡¢¤½¤Î´ðËÜŪ¤Êµ¡Ç½À­¤ÎÀâÌÀ¤òÄ󶡤·¤Þ¤¹¡£
Libxml¤È¤½¤ÎÍøÍѤˤĤ¤¤Æ¤Î¤è¤ê¾ÜºÙ¤Ê¾ðÊó¤Ï¡¢¥×¥í¥¸¥§¥¯¥È¤Î¥Û¡¼¥à¥Ú¡¼¥¸¤¬ÍøÍѤǤ­¤Þ¤¹¡£¤½¤³¤Ç¤Ï´°Á´¤ÊAPI¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹¡£¤³¤Î¥Á¥å¡¼¥È¥ê¥¢¥ë¤Ï¡¢´°Á´¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤ÎÂå¤ï¤ê¤È¤¤¤¦¤â¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢´ðËÜŪ¤Ê½èÍý¤òÁàºî¤¹¤ë¤Î¤Ë¥é¥¤¥Ö¥é¥ê¤ò»ÈÍѤ¹¤ë¤Î¤ËɬÍפȤµ¤ì¤ë´Ø¿ô¤òÀâÌÀ¤·¤Æ¤¤¤Þ¤¹¡£

¤³¤Î¥Á¥å¡¼¥È¥ê¥¢¥ëÆâ¤Î¥³¡¼¥ÉÎã¤Ï¡¢°Ê²¼¤ò¤É¤Î¤è¤¦¤Ë¹Ô¤¦¤«¤ò¼Â±é¤·¤Æ¤¤¤Þ¤¹¡£
  • ¥É¥­¥å¥á¥ó¥È¤Î²òÀÏ
  • »ØÄꤵ¤ì¤¿Í×ÁǤ˴ޤޤì¤ë¥Æ¥­¥¹¥È¤Î¼èÆÀ
  • Í×ÁǤȤ½¤ÎÆâÍƤÎÄɲÃ
  • °À­¤ÎÄɲÃ
  • °À­ÃͤμèÆÀ



£²¡¥¥Ç¡¼¥¿¥¿¥¤¥×
Libxml¤Ï¡¢²æ¡¹¤¬²¿Å٤ⰷ¤¦¤Ç¤¢¤í¤¦Â¿¿ô¤Î¥Ç¡¼¥¿¥¿¥¤¥×¤òÀë¸À¤·¤Æ¤ª¤ê¡¢Ìñ²ð¤Ê»öÊÁ¤ò±£¤·¤Æ¤¤¤Æ¡¢¤¤¤¯¤Ä¤«¤ÎÆüì¤ÊÍ׵᤬¤Ê¤¤¸Â¤ê¡¢¤½¤ì¤é¤ò°·¤¦É¬ÍפϤ¢¤ê¤Þ¤»¤ó¡£

xmlChar´ðËÜŪ¤Êchar¤ÎÂåÍÑÉʤǤ¢¤ê¡¢UTF-£¸¥¨¥ó¥³¡¼¥Éʸ»úÎóÃæ¤Îbyte¤È¤Ê¤ê¤Þ¤¹¡£¤â¤·¡¢¥Ç¡¼¥¿¤¬Ê̤Υ¨¥ó¥³¡¼¥É¤ò»ÈÍѤ¹¤ë¤Ê¤é¤Ð¡¢libxml´Ø¿ô¤ÎÍøÍѤΤ¿¤á¤ËUTF-£¸¤ËÊÑ´¹¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ë¤Ä¤¤¤Æ¤Î¾ÜºÙ¤Ê¾ðÊó¤Ï¡¢libxml¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î¥µ¥Ý¡¼¥È¡¦¥¦¥¨¥Ö¥Ú¡¼¥¸¤¬ÍøÍѤǤ­¤Þ¤¹¡£
xmlDoc²òÀϤµ¤ì¤¿¥É¥­¥å¥á¥ó¥È¤«¤éÀ¸À®¤µ¤ì¤¿¥Ä¥ê¡¼¤ò´Þ¤à¹½Â¤ÂΤǤ¹¡£xmlDocPtr¤Ï¹½Â¤ÂΤؤΥݥ¤¥ó¥¿¤Ç¤¹¡£
xmlNodeñ°ì¥Î¡¼¥É¤ò´Þ¤à¹½Â¤ÂΤǤ¹¡£xmlNodePtr¤Ï¹½Â¤ÂΤؤΥݥ¤¥ó¥¿¤Ç¤¢¤ê¡¢¥É¥­¥å¥á¥ó¥È¡¦¥Ä¥ê¡¼¤ò¥È¥é¥Ð¡¼¥¹¤¹¤ëºÝ¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£



£³¡¥¥Õ¥¡¥¤¥ë¤ò²òÀϤ·¤ÆÍ×ÁǤò¼è¤ê½Ð¤¹Îã
­¡¡¡xmlDocPtr doc;
­¢¡¡xmlNodePtr cur;
­£¡¡doc = xmlParseFile(docname);
­¤¡¡if (doc == NULL ) {
fprintf(stderr,"Document not parsed successfully. \n");
return;
}
­¥¡¡cur = xmlDocGetRootElement(doc);
­¦¡¡if (cur == NULL) {
fprintf(stderr,"empty document\n");
xmlFreeDoc(doc);
return;
}
­§¡¡if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
fprintf(stderr,"document of the wrong type, root node != story");
xmlFreeDoc(doc);
return;
}
­¨¡¡cur = cur->xmlChildrenNode;
­©¡¡while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
parseStory (doc, cur);
}
cur = cur->next;
}
xmlFreeDoc(doc);
return;


­¡ ¥Ñ¡¼¥¹¤µ¤ì¤¿¥É¥­¥å¥á¥ó¥È¤ò»Ø¤·¼¨¤¹¤¿¤á¤Î¥Ý¥¤¥ó¥¿¤òÀë¸À¤·¤Þ¤¹¡£
­¢ ¥Î¡¼¥É¤Î¥Ý¥¤¥ó¥¿¤òÀë¸À¤·¤Þ¤¹¡£
­£ ¥É¥­¥å¥á¥ó¥È̾¤«¤é¥Ñ¡¼¥¹¤¹¤ëlibxml2 API¤ò»ÈÍѤ·¤Þ¤¹¡£
­¤ ¥¨¥é¡¼¥Á¥§¥Ã¥¯¡¢¥¨¥é¡¼¤Î¾ì¹ç¤³¤Î»þÅÀ¤Î¥¨¥é¡¼¤òµ­Ï¿¤·¤ÆÄä»ß¤·¤Þ¤¹¡£
NOTE¡§¶¦Ä̤·¤¿¥¨¥é¡¼¤ÎÎã¤È¤·¤Æ¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î°·¤¤¤¬½ÅÍפǤ¹¡£XML¤Îɸ½à¤Ï¡¢UTF-8,UTF-16°Ê³°¤Ç¤Ï¡¢ÌÀ³Î¤ÊÀë¸À¤ò´Þ¤ó¤À¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ç³ÊǼ¤µ¤ì¤ë¤³¤È¤òÍ׵ᤷ¤Þ¤¹¡£¤â¤·Àë¸À¤¬¤½¤³¤Ë¤¢¤ë¤Ê¤é¤Ð¡¢libxml¤Ï¡¢¼«Æ°Åª¤ËɬÍפ˱þ¤¸¤ÆUTF-8¤ØÊÑ´¹¤·¤Þ¤¹¡£XML¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ë¤Ä¤¤¤Æ¤Î¾ÜºÙ¤Ê¾ðÊó¤Ï¡¢É¸½à¤ÎÃæ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£
­¥ ¥ë¡¼¥ÈÍ×ÁǤòÃê½Ð¤·¤Þ¤¹¡£
­¦ ¥É¥­¥å¥á¥ó¥È¤¬¼«Æ°Åª¤Ë²¿¤«¤ò´Þ¤ó¤Ç¤¤¤ë¤«³Î¤«¤á¤Þ¤¹¡£
­§ ¤³¤³¤Ç¤Ï¡¢¥É¥­¥å¥á¥ó¥È¤¬Àµ¤·¤¤·Á¼°¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¡Éstory¡É¤Ï¡¢¤³¤Î¥Á¥å¡¼¥È¥ê¥¢¥ë¤Ç»ÈÍѤµ¤ì¤ë¥É¥­¥å¥á¥ó¥È¤Î¥ë¡¼¥È¤Î·Á¼°¤Ç¤¹¡£
­¨ ºÇ½é¤Î»Ò¥Î¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£¤³¤ÎÅÀ¤Ç¤Ï¡¢cur¤Ï¥É¥­¥å¥á¥ó¥È¤Î¥ë¡¼¥È¤ò»Ø¤·¤Æ¤ª¤ê¡¢¤½¤ì¤Ï¡Éstory¡ÉÍ×ÁǤǤ¹¡£
­© ¤³¤Î¥ë¡¼¥×¤Ï¡¢¡Éstryinfo¡ÉÍ×ÁǤòõ¤·¤Ê¤¬¤é¡¢¡Éstory¡É¤Î»Ò¶¡¤È¤Ê¤ëÍ×ÁÇ´Ö¤ò¥¤¥Æ¥ì¡¼¥È¤·¤Þ¤¹¡£¡Éstoryinfo¡É¤Ï¡¢¤³¤Î¥×¥í¥°¥é¥à¤¬Ãµ¤·¤Æ¤¤¤ë¡Ékeywords¡É¤ò´Þ¤àÍ×ÁǤǤ¹¡£Libxml¤Îʸ»úÎóÈæ³Ó´Ø¿ô¤Ç¤¢¤ëxmlStrcmp¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£¤â¤·°ìÃפ·¤¿¤Ê¤é¤Ð¡¢parseStroy()¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£

void
parseStory (xmlDocPtr doc, xmlNodePtr cur) {
xmlChar *key;
­¡ cur = cur->xmlChildrenNode;
­¢ while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) {
­£ key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf("keyword: %s\n", key);
xmlFree(key);
}
cur = cur->next;
}
return;
}

­¡ ºÆÅÙ¡¢ºÇ½é¤Î»Ò¥Î¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£
­¢ ¾åµ­¤Î¤è¤¦¤Ê¥ë¡¼¥×¤Ç¤Ï¡¢¶½Ì£¤¢¤ëÍ×Áǡʤ³¤³¤Ç¤Ï¡Ékeyword¡É¡Ë¤È¤Î°ìÃפòõ¤·¤Ê¤¬¤é¡¢¥Î¡¼¥É´Ö¤ò¥¤¥Æ¥ì¡¼¥È¤·¤Þ¤¹¡£
­£ ¡Èkeyword¡ÉÍ×ÁǤò¸«¤Ä¤±¤¿¤È¤­¡¢¤³¤ÎÆâÍƤò¥×¥ê¥ó¥È¤·¤Þ¤¹¡£XML¤Ç¤Ï¡¢Í×ÁÇÃæ¤Ë´Þ¤Þ¤ì¤ë¥Æ¥­¥¹¥È¤Ï¡¢Í×ÁǤλҥΡ¼¥É¤È¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¤ò»×¤¤½Ð¤·¤Æ¤¯¤À¤µ¤¤¡£¤½¤Î¤¿¤á¡¢cur->xmlChidrenNode¤òÊÖ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤ì¤òÃê½Ð¤¹¤ë¤¿¤á¤ËxmlNodeListGetString()´Ø¿ô¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤ì¤â¤Þ¤¿¡¢doc¥Ý¥¤¥ó¥¿¤ò°ú¿ô¤Ë¤È¤ê¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢¤Á¤ç¤¦¤É¤½¤ì¤ò¥×¥ê¥ó¥È¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

NOTE¡§xmlNodeListGetString()¤Ï¡¢Ê¸»úÎóÍѤ˥á¥â¥ê¤ò¥¢¥í¥±¡¼¥È¤¹¤ë¤¿¤á¡¢¤³¤ì¤ò¥Õ¥ê¡¼¤¹¤ë¤¿¤á¤Ë¤ÏxmlFree()¤ò»ÈÍѤ·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£



£´¡¥Path¤ò»ÈÍѤ·¤ÆÍ×ÁǤò¼è¤ê½Ð¤¹Îã
Í×ÁǤò¸«¤Ä¤±¤ë¤¿¤á¤Ë¥É¥­¥å¥á¥ó¥Ètree¤òÊ⤭²ó¤ë¤³¤È¤Ë²Ã¤¨¤Æ¡¢Libxml2¤Ï»ØÄꤵ¤ì¤¿´ð½à¤È°ìÃפ¹¤ë¥Î¡¼¥É½¸¹ç¤ò¼è¤ê½Ð¤¹¤¿¤á¤ËXPath¼°¤Î»ÈÍѤòÄ󶡤·¤Æ¤¤¤Þ¤¹¡£XPath¤Î´°Á´¤Ê¥É¥­¥å¥á¥ó¥È¤Ï¤³¤³¤Ë¤¢¤ê¤Þ¤¹(?)¡£

XPath¤Ï¡¢¥É¥­¥å¥á¥ó¥È¤òÄ̤·¤Æ»ØÄꤵ¤ì¤¿´ð½à¤Ë°ìÃפ¹¤ë¥Î¡¼¥É¤ò¤ß¤Ä¤±¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£°Ê²¼¤ÎÎã¤Ç¤Ï¡¢¥É¥­¥å¥á¥ó¥È¤òÄ̤·¤Æ¤¹¤Ù¤Æ¤ÎkeywordÍ×ÁǤÎÆâÍƤò¸«¤Ä¤±¤ë¤â¤Î¤Ç¤¹¡£

NOTE¡§´°Á´¤ÊXPath¤ÎÀâÌÀ¤Ï¡¢¤³¤Î¥É¥­¥å¥á¥ó¥È¤ÎÈϰϤòĶ¤¨¤Æ¤¤¤Þ¤¹¡£ÍøÍѤ˺ݤ·¤Æ¤Î¾ÜºÙ¤Ï¡¢XPath »ÅÍͽñ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
¤³¤ÎÎã¤Î´°Á´¤Ê¥³¡¼¥É¤Ï¡¢ÉÕÏ¿D¡¢Code for XPath Example¤Ë¤¢¤ê¤Þ¤¹¡£

XPath¤ÎÍøÍѤÏxmlXPathContext¤ò¥»¥Ã¥È¥¢¥Ã¥×¤·¡¢XPath¼°¤È¥³¥ó¥Æ¥­¥¹¥È¤òxmlXPathEvalExpression´Ø¿ô¤ËÍ¿¤¨¤Þ¤¹¡£´Ø¿ô¤Ï¡¢xmlXPathObjectPtr¤òÊÖ¤·¤Þ¤¹¡£¤³¤ì¤ÏXPath¼°¤òËþ¤¿¤¹¥Î¡¼¥É½¸¹ç¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹¡£

xmlXPathObjectPtr
getnodeset (xmlDocPtr doc, xmlChar *xpath)
¡¡¡¡{
­¡¡¡¡¡xmlXPathContextPtr context;
xmlXPathObjectPtr result;
­¢¡¡¡¡context = xmlXPathNewContext(doc);
­£¡¡¡¡result = xmlXPathEvalExpression(xpath, context);
xmlXPathFreeContext(context);
­¤¡¡¡¡if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
xmlXPathFreeObject(result);
printf("No result\n");
return NULL;
¡¡ }
return result;
¡¡¡¡}

­¡ ºÇ½é¤ËÊÑ¿ô¤òÀë¸À¤·¤Þ¤¹¡£
­¢ contextÊÑ¿ô¤ò½é´ü²½¤·¤Þ¤¹¡£
­£ XPath¼°¤òŬÍѤ·¤Þ¤¹¡£
­¤ ·ë²Ì¤ò¸¡ºº¤·¡¢¤â¤··ë²Ì¤¬¤Ê¤¤¤Î¤Ç¤¢¤ì¤Ð¡¢resultÍѤ˥¢¥í¥±¡¼¥È¤·¤¿¥á¥â¥ê¤ò³«Êü¤·¤Þ¤¹¡£

´Ø¿ô¤«¤éÊÖ¤µ¤ì¤ëxmlPathObjectPtr¤Ï¡¢¥Î¡¼¥É½¸¹ç¤È¡¢½¸¹çÆâ¤ò¥¤¥Æ¥ì¡¼¥È¤¹¤ë¤Î¤ËɬÍפȤµ¤ì¤ë¾¤Î¾ðÊó¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢´Ø¿ô¤ÏxmlXPathObjectPtr¤òÊÖ¤·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥ÈÃæ¤Îkeyword¥Î¡¼¥É¤ÎÆâÍƤò¥×¥ê¥ó¥È¤¹¤ë¤Î¤Ë»ÈÍѤ·¤Þ¤¹¡£¥Î¡¼¥É½¸¹ç¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¢¥Î¡¼¥É½¸¹çÆâ¤ÎÍ×ÁÇ¿ô(noedNr)¤È¥Î¡¼¥ÉÇÛÎó(nodeTab)¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹¡£


nodeset = result->nodesetval;
­¡¡¡for (i=0; i < nodeset->nodeNr; i++) {
­¢¡¡¡¡keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1);
printf("keyword: %s\n", keyword);
xmlFree(keyword);
}

­¡ nofeset->nodeNr¤ÎÃͤϡ¢¥Î¡¼¥É½¸¹çÃæ¤ÎÍ×ÁǤοô¤òÊݸ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤³¤Ç¤Ï¡¢ÇÛÎóÆâ¤ò¥¤¥Æ¥ì¡¼¥È¤¹¤ë¤Î¤Ë¤½¤ì¡ÊÍ×ÁÇ¿ô¡Ë¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£
­¢ ¤³¤³¤Ç¤Ï¡¢ÊÖ¤µ¤ì¤¿¥Î¡¼¥É¤Î³Æ¡¹¤ÎÆâÍƤò¥×¥ê¥ó¥È¤·¤Æ¤¤¤Þ¤¹¡£

NOTE¡§ÊÖ¤µ¤ì¤¿¥Î¡¼¥É¤Î»Ò¥Î¡¼¥É¤ò¥×¥ê¥ó¥È¤·¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£¤³¤ì¤ÏkeywordÍ×ÁǤÎÆâÍƤϻҶ¡¤Î¥Æ¥­¥¹¥È¥Î¡¼¥É¤À¤«¤é¤Ç¤¹¡£



£µ.Í×ÁǤÎÆâÍƤò½ñ¤­½Ð¤¹Îã
Í×ÁǤÎÆâÍƤνñ¤­½Ð¤·¤Ï¡¢¾åµ­¤Ë»ÈÍѤ·¤¿¤Î¤ÈƱ¤¸Â¿¤¯¤Î¥¹¥Æ¥Ã¥×¤ò»ÈÍѤ·¤Þ¤¹¡Ý¥É¥­¥å¥á¥ó¥È¤ò¥Ñ¡¼¥¹¤·¤Æ¥Ä¥ê¡¼¤òÊ⤭²ö¤ê¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥È¤ò²òÀϤ·¡¢ÅêÆþ¤·¤¿¤¤Í×ÁǤΰÌÃÖ¤ò¸«¤Ä¤±¤ë¤¿¤á¤Ë¥Ä¥ê¡¼¤ò¥È¥é¥Ð¡¼¥¹¤·¤Þ¤¹¡£Î㤨¤Ð¡¢ºÆÅÙ¡Éstoryinfo¡ÉÍ×ÁǤò¤ß¤Ä¤±¤Æ¡¢Æ±»þ¤Ëkeyword¤òÆþ¤ì¤ë¾ì¹ç¤Ç¤¹¡£¤½¤·¤Æ¡¢¥Õ¥¡¥¤¥ë¤ò¥Ç¥£¥¹¥¯¤Ë½ñ¤­½Ð¤·¤Þ¤¹¡£´°Á´¤Ê¥³¡¼¥É¡§ÉÕÏ¿E¡¢Code for Add Keyword Example

¤³¤ÎÎã¤ÎÃæ¤Î°ìÈ֤ΰ㤤¤Ï¡¢parseStory¤Ë¤¢¤ê¤Þ¤¹¡§

void
parseStory (xmlDocPtr doc, xmlNodePtr cur, char *keyword) {
­¡ xmlNewTextChild (cur, NULL, "keyword", keyword);
return;
¡¡¡¡ }

­¡ xmlNewTextChild´Ø¿ô¤Ï¡¢¥Ä¥ê¡¼Æâ¤Ç¡¢cur¤Ç¼¨¤µ¤ì¤ë¥«¥ì¥ó¥È¡¦¥Î¡¼¥É¡¦¥Ý¥¤¥ó¥¿¤Î°ÌÃ֤˿·¤·¤¤»Ò¶¡¤ÎÍ×ÁǤòÄɲä·¤Þ¤¹¡£

°ìÅ٥Ρ¼¥É¤¬Äɲ䵤ì¤ë¤È¡¢¥É¥­¥å¥á¥ó¥È¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤¤¤Æ¤â¤è¤¤¤Ç¤¹¡£¤â¤·Í×ÁǤË̾Á°¶õ´Ö¤ò»ý¤¿¤»¤¿¤¤¤Ê¤é¤Ð¡¢¤½¤Î¤è¤¦¤Ë¤³¤³¤Ë²Ã¤¨¤é¤ì¤Þ¤¹¡£¤³¤³¤Ç¤Ï¡¢Ì¾Á°¶õ´Ö¤ÏNULL¤Ç¤¹¡£

¡¡¡¡xmlSaveFormatFile(docname, doc, l);

ºÇ½é¤Î¥Ñ¥é¥á¡¼¥¿¤Ï½ñ¤­¹þ¤Þ¤ì¤ë¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ç¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤¬Æɤ߹þ¤ó¤À¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¤Ç¤¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤Î¾ì¹ç¡¢¸Å¤¤¥Õ¥¡¥¤¥ë¤Ë¾å½ñ¤­¤·¤Þ¤¹¡££²ÈÖÌܤΥѥé¥á¡¼¥¿¡¼¤ÏxmlDoc¹½Â¤ÂΤؤΥݥ¤¥ó¥¿¤Ç¤¹¡£»°ÈÖÌܤΥѥé¥á¡¼¥¿¤ÎÀßÄê¤Ï¡¢¥¤¥ó¥Ç¥ó¥È½ÐÎϤòÊݾ㤹¤ë¤È¤¤¤¦¤Î¤ÈƱ¤¸¤³¤È¤Ç¤¹(?)¡£¡ÊÌõÃí¡§¥Æ¥­¥¹¥È¥Î¡¼¥É¤Ë¥¤¥ó¥Ç¥ó¥È¤òÆþ¤ì¤ë¤¿¤á¤Î¥Ñ¥é¥á¡¼¥¿¤Î¤è¤¦¤Ç¤¢¤ë¤¬¡¢¥Þ¥Ë¥å¥¢¥ë¤Ç¤Ï¤è¤¯¤ï¤«¤é¤ºÍøÍѤ·¤Ê¤¤¤Û¤¦¤¬¤è¤¤¤è¤¦¤Ç¤¢¤ë¡£¡Ë



£¶.°À­¤ò½ñ¤­½Ð¤¹Îã
°À­¤ò½ñ¤­½Ð¤¹¤³¤È¤Ï¡¢¥Æ¥­¥¹¥È¤ò¿·¤·¤¤Í×ÁǤ˽ñ¤­½Ð¤¹¤Î¤Ë»÷¤Æ¤¤¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ç¤Ï¡¢¥É¥­¥å¥á¥ó¥È¤Ë»²¾ÈURI¤òÄɲ䷤Ƥ¤¤Þ¤¹¡£´°Á´¤Ê¥³¡¼¥É¡§ÉÕÏ¿F¡¢Code for Add Attribute Example.

reference¤Ï¡¢storyÍ×ÁǤλҶ¡¤Ç¤¢¤ê¡¢¤½¤Î¤¿¤á¿·¤·¤¤Í×ÁǤÈ°À­¤ò½ñ¤­¹þ¤à¤¿¤á¤Î¾ì½ê¤ò¸«¤Ä¤±¤ë¤Î¤Ïñ½ã¤Ç¤¹¡£parseDocÃæ¤Ç¤Î¥¨¥é¡¼¥Á¥§¥Ã¥¯¥Æ¥¹¥È¤ÈƱ»þ¤Ë¡¢Í×ÁǤòÄɲ乤뤿¤á¤ÎÀµ¤·¤¤°ÌÃ֤ˤ¤¤Þ¤¹¡£¤·¤«¤·¡¢¤½¤ì¤ò¹Ô¤¦Á°¤Ë¡¢²æ¡¹¤¬¤Þ¤À¸«¤¿¤³¤È¤Î¤Ê¤¤¥Ç¡¼¥¿¥¿¥¤¥×¤ò»ÈÍѤ¹¤ë¤È¤¤¤¦Àë¸À¤ò¹Ô¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£

¡¡¡¡xmlAttrPtr newattr;

¤Þ¤¿¡¢ÄɲäÎxmlNodePtr¤âɬÍפǤ¹¡£

¡¡¡¡xmlNodePtr newnode;

parseDoc¤Î»Ä¤ê¤ÎÉôʬ¤Ï¡¢¥ë¡¼¥ÈÍ×ÁǤ¬story¤Ç¤¢¤ë¤«¤Î¥Á¥§¥Ã¥¯¤ò¹Ô¤¦Á°¤ÎÉôʬ¤Þ¤Ç¤ÈƱ¤¸¤Ç¤¹¡£¤â¤·¤½¤¦¤Ç¤¢¤ë¤Ê¤é¤Ð¡¢¼«Ê¬¤¿¤Á¤¬Í×ÁǤòÄɲ乤ë¤Î¤ËÀµ¤·¤¤°ÌÃ֤ˤ¤¤ë¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£

­¡¡¡newnode = xmlNewTextChild (cur, NULL, "reference", NULL);
­¢¡¡newattr = xmlNewProp (newnode, "uri", uri);

­¡ ½é¤Ë¡¢¸½ºß¤Î¥Î¡¼¥É¥Ý¥¤¥ó¥¿¡¼¤Ç¤¢¤ëcur¤Î°ÌÃ֤ˡ¢xmlNewTextChild¤ò»ÈÍѤ·¤Æ¡¢¿·¤·¤¤¥Î¡¼¥É¤òÄɲä·¤Þ¤¹¡£
­¢ xmlNewProp¤Ç¿·¤·¤¤¥Î¡¼¥É¤Ë°À­¤òÄɲä·¤Þ¤¹¡£



£·¡¥Â°À­¤ò¼è¤ê½Ð¤¹Îã
°À­¤ÎÃͤμè¤ê½Ð¤·¤Ï¡¢¥Î¡¼¥É¤Î¥Æ¥­¥¹¥ÈÆâÍƤò¼è¤ê½Ð¤·¤¿¾åµ­¤ÎÎã¤Ë»÷¤Æ¤¤¤Þ¤¹¡£¤³¤³¤Ç¤Ï¡¢Á°¤Î¥»¥¯¥·¥ç¥ó¤ÇÄɲä·¤¿URI¤ÎÃͤò¼è¤ê½Ð¤·¤Þ¤¹¡£´°Á´¤Ê¥³¡¼¥É¡§ÉÕÏ¿G¡¢Code for Retriving Attribute Value Example.

¤³¤ÎÎã¤ÎºÇ½é¤Î¥¹¥Æ¥Ã¥×¤Ï¡¢Á°¤Î¤â¤Î¤È»÷¤Æ¤¤¤Þ¤¹¡£:¥É¥­¥å¥á¥ó¥È¤ò¥Ñ¡¼¥¹¤·¤Æ¡¢¶½Ì£¤¢¤ëÍ×ÁǤò¸«¤Ä¤±¡¢Í׵ᤵ¤ì¤¿»ØÄ꥿¥¹¥¯¤ò¼Â¹Ô¤¹¤ë´Ø¿ô¤òµ¯Æ°¤·¤Þ¤¹¡£¤³¤³¤Ç¤Ï¡¢getReference¤ò¸Æ¤Ó¤Þ¤¹¡§

void
getReference (xmlDocPtr doc, xmlNodePtr cur) {
xmlChar *uri;
cur = cur->xmlChildrenNode;
while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"reference"))) {
­¡¡¡¡¡uri = xmlGetProp(cur, "uri");
printf("uri: %s\n", uri);
xmlFree(uri);
¡¡¡¡}
cur = cur->next;
¡¡}
return;
}

­¡ ¼çÍפʴؿô¤ÏxmlGetProp¤Ç¤¢¤ê¡¢Â°À­Ãͤò´Þ¤ó¤ÀxmlChar¤òÊÖ¤·¤Þ¤¹¡£¤³¤³¤Ç¤Ï¡¢¤½¤ì¤ò¥×¥ê¥ó¥È¤·¤Æ¤¤¤Þ¤¹¡£

NOTE¡§¤â¤·¡¢Â°À­ÍѤˡ¢¸ÇÄê¡¢¤â¤·¤¯¤Ï¥Ç¥Õ¥©¥ë¥È¤ÎÃͤòÀë¸À¤·¤Æ¤¤¤ëDTD¤ò»ÈÍѤ·¤Æ¤¤¤ë¤Ê¤é¤Ð¡¢¤³¤Î´Ø¿ô¤Ï¤½¤ì¤ò¼èÆÀ¤¹¤ë¤Ç¤·¤ç¤¦¡£



£¸¡¥¥¨¥ó¥³¡¼¥ÉÊÑ´¹
¥Ç¡¼¥¿¡¦¥¨¥ó¥³¡¼¥É¤Î¸ß´¹À­¤ÎÌäÂê¤Ï¡¢°ìÈÌŪ¤Ë¤ÏXML¤Ë¤ª¤¤¤Æ¡¢¤½¤·¤ÆÆäËlibxml¤Ë¤ª¤¤¤Æ¡¢¥×¥í¥°¥é¥Þ¡¼¤¬½Ð²ñ¤¦¶¦Ä̤κǤâÆñ¤·¤¤ÌäÂê¤Î£±¤Ä¤Ç¤¹¡£¤³¤ÎÌäÂê¤ò¹Íθ¤·¤Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÀ߷פòÄ̤·¤Æ¹Í¤¨¤ë¤³¤È¤Ï¡¢¸å¤Ëº¤Æñ¤Ê¤³¤È¤òÈò¤±¤ë½õ¤±¤È¤Ê¤ë¤Ç¤·¤ç¤¦¡£ÆâÉôŪ¤Ë¤Ï¡¢libxml¤Ï¥Ç¡¼¥¿¤Î³ÊǼ¤äÁàºî¤ÏUTF-8¤Ç¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£Ê̤ηÁ¼°¤Ç¤¢¤Ê¤¿¤Î¥×¥í¥°¥é¥à¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤ë¥Ç¡¼¥¿¡¢Î㤨¤Ð°ìÈ̤˻ÈÍѤµ¤ì¤Æ¤¤¤ëISO-8859-1¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ê¤É¤Ï¡¢xlibxml´Ø¿ô¤ËÅϤµ¤ì¤ëÁ°¤ËUTF-8¤ËÊÑ´¹¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£¤â¤·¡¢¤¢¤Ê¤¿¤Î¥×¥í¥°¥é¥à½ÐÎϤòUTF-8°Ê³°¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ë¤·¤¿¤¤¤Ê¤é¤Ð¡¢¤½¤ì¤âÊÑ´¹¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£

libxml¤Ï¡¢¥Ç¡¼¥¿ÊÑ´¹¤Î¤¿¤á¤ËÍøÍѲÄǽ¤Ç¤¢¤ë¤Ê¤é¤Ðiconv¤ò»ÈÍѤ·¤Þ¤¹¡£iconv¤¬¤Ê¤¤¾ì¹ç¤Ï¡¢UTF-8¤ÈUTF-16¤ÈISO-8859-1¤À¤±¤¬³°Éô·Á¼°¤È¤·¤Æ»ÈÍѲÄǽ¤Ç¤¹¡£iconv¤Ç¤Ï¡¢iconv¤¬UTF-8¤Ø¡¢¤Þ¤¿¤Ï¤«¤é¡¢ÊÑ´¹¤Ç¤­¤ë¿¿ô¤Î·Á¼°¤¬ÍøÍѲÄǽ¤Ç¤¹¡£¸½ºß¤Ç¤Ï¡¢iconv¤ÏǤ°Õ·Á¼°¤«¤éǤ°Õ·Á¼°¤Ø¤ÎÊÑ´¹Ç½ÎϤò¤â¤ÄÌó£±£µ£°¤Î°ã¤Ã¤¿Ê¸»ú·Á¼°¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£¼ÂºÝ¤Î¥µ¥Ý¡¼¥È·Á¼°¤Î¿ô¤Ï¼ÂÁõ¤Ë¤è¤Ã¤Æ°ã¤Ã¤Æ¤¤¤ë¤â¤Î¤Î¡¢¤¹¤Ù¤Æ¤Îiconv¼ÂÁõ¤Ï¡¢Ã¯¤Ç¤â¤¬Ê¹¤¤¤¿¤³¤È¤Î¤¢¤ë¤¹¤Ù¤Æ¤Î·Á¼°¤ò¥µ¥Ý¡¼¥È¤¹¤ë¤³¤È¤ò¡¢¤Û¤ÜÊݾ㤷¤Æ¤¤¤Þ¤¹¡£

Ãí°Õ¡§¶¦Ä̤δְ㤨¤Ï¡¢ÆâÉô¥³¡¼¥É¤È¤·¤Æ¡¢¤¢¤ë¥³¡¼¥ÉÃæ¤ÎÉôʬËè¤Ë°ã¤Ã¤¿·Á¼°¤ò»ÈÍѤ¹¤ë¤³¤È¤Ç¤¹¡£ºÇ¤â¶¦Ä̤Υ±¡¼¥¹¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÏISO-8859-1¤òÆâÉô¥Ç¡¼¥¿·Á¼°¤ÈÁÛÄꤷ¡¢UTF-8¤òÆâÉô¥Ç¡¼¥¿·Á¼°¤ÈÁÛÄꤷ¤Æ¤¤¤ëlibxml¤È·ë¹ç¤¹¤ë¤³¤È¤Ç¤¹¡£·ë²Ì¤Ï¡¢¤É¤Î¥³¡¼¥ÉÉôʬ¤¬¼Â¹Ô¤µ¤ì¤ë¤«¤Ë°Í¸¤·¤Æ¡¢ÆâÉô¥Ç¡¼¥¿¤ò°ã¤Ã¤¿¤â¤Î¤Ë°·¤¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤È¤Ê¤ê¤Þ¤¹¡£¥³¡¼¥É¤Î¤É¤ì¤«¤ÎÉôʬ¤Ï¡¢É¬Á³Åª¤Ë¡¢¥Ç¡¼¥¿¤ò´Ö°ã¤Ã¤Æ²ò¼á¤·¤Þ¤¹¡£


¤³¤ÎÎã¤Ï¡¢´Êñ¤Ê¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¡¢¤½¤·¤Æ¥³¥Þ¥ó¥É¥é¥¤¥ó¤«¤é¼èÆÀ¤·¤¿ÆâÍƤò¥É¥­¥å¥á¥ó¥È¤Î¥ë¡¼¥ÈÍ×ÁǤËÉÕ¤±²Ã¤¨¡¢¤½¤·¤ÆŬÀڤʥ¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ç·ë²Ì¤òstdout¤Ë½ñ¤­½Ð¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢ISO-8859-1¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ÈÍѤ·¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤«¤éÆþÎϤµ¤ì¤¿Ê¸»úÎó¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ÏISO-8859-1¤«¤éUTF-8¤ËÊÑ´¹¤µ¤ì¤Þ¤¹¡£´°Á´¤Ê¥³¡¼¥É¡§ÉÕÏ¿H¡¢Code for Encoding Conversion Example


ÊÑ´¹¡Êconvert´Ø¿ôÆâÉô¤Î¥³¡¼¥ÉÎã¤Ç¥«¥×¥»¥ë²½¤µ¤ì¤Æ¤¤¤ë¤È¤³¤í¡Ë¤Ï¡¢libxml¤ÎxmlFindCharEncodingHandler´Ø¿ô¤ò»ÈÍѤ·¤Þ¤¹¡§

­¡¡¡xmlCharEncodingHandlerPtr handler;
­¢¡¡size = (int)strlen(in)+1;
out_size = size*2-1;
out = malloc((size_t)out_size);
¡Ä
­£¡¡handler = xmlFindCharEncodingHandler(encoding);
¡Ä
­¤¡¡handler->input(out, &out_size, in, &temp);
¡Ä
­¥ xmlSaveFormatFileEnc("-", doc, encoding, 1);


­¡ handler¤Ï¡¢xmlCharEncodingHandler´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤È¤·¤ÆÀë¸À¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
­¢ xmlCharEncodingHandler´Ø¿ô¤Ï¡¢Í¿¤¨¤é¤ì¤ëÆþÎϤȽÐÎÏʸ»úÎó¤Î¥µ¥¤¥º¤¬É¬ÍפǤ¹¡£¤½¤ì¤é¤Ï¡¢Ê¸»úÎóin¤ÈoutÍѤˡ¢¤³¤³¤Ç·×»»¤µ¤ì¤Þ¤¹¡£
­£ xmlFIndCharEncodingHandler¤Ï¡¢°ú¿ô¤È¤·¤Æ¥Ç¡¼¥¿¤Î½é´ü¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò¤È¤ê¡¢libxml¤Î¥Ó¥ë¥È¥¤¥ó¤ÎÊÑ´¹¥Ï¥ó¥É¥é¡¼¤ò¸¡º÷¤·¤Æ¡¢´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤«¡¢¤â¤·¸«¤Ä¤«¤é¤Ê¤±¤ì¤ÐNULL¤òÊÖ¤·¤Þ¤¹¡£
­¤ handler¤Ë¤è¤Ã¤Æ¼±Ê̤µ¤ì¤ëÊÑ´¹´Ø¿ô¤Ï¡¢°ú¿ô¤È¤·¤Æ¡¢ÆþÎϤȽÐÎÏʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿¤È¡¢³Æ¡¹¤ÎŤµ¤òÍ׵ᤷ¤Þ¤¹¡£Ä¹¤µ¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÊÌ¡¹¤Ë·èÄꤵ¤ì¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
­¥ UTF-8¤È¤ÏÊ̤ÎÆÃÄê¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ç½ÐÎϤ¹¤ë¤¿¤á¤Ë¤Ï¡¢xmlSaveFormatFileEnc¤ò»ÈÍѤ·¡¢¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ØÄꤷ¤Þ¤¹¡£



A. Compile
Libxml¤Ï¡¢¥¹¥¯¥ê¥×¥È¤Ç¤¢¤ë¡¢xml-config¤Ç¥¤¥ó¥¯¥ë¡¼¥É¤·¤Þ¤¹¡£¤³¤Î¥¹¥¯¥ê¥×¥È¤Ï¡¢ºîÀ®¤µ¤ì¤¿¥×¥í¥°¥é¥à¤È¥é¥¤¥Ö¥é¥ê¤Î¥³¥ó¥Ñ¥¤¥ë¤È¥ê¥ó¥¯¤Î¤¿¤á¤Î¥Õ¥é¥°¤òÀ¸À®¤·¤Þ¤¹¡£¥×¥ê¥×¥í¥»¥Ã¥µ¡¼¤È¥³¥ó¥Ñ¥¤¥éÍѤΥե饰¤Ï¡¢xml2-config –cflags¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£¥é¥¤¥Ö¥é¥ê¤È¤Î¥ê¥ó¥¯ÍѤΥե饰¤Ï¡¢xml2-config –libs¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£¤½¤Î¾¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢xml2-config –help¤¬ÍøÍѲÄǽ¤Ç¤¹¡£
2006ǯ04·î18Æü(²Ð) 10:29:38 Modified by koba24505




¥¹¥Þ¡¼¥È¥Õ¥©¥óÈǤǸ«¤ë