{"id":102,"date":"2007-08-06T14:56:01","date_gmt":"2007-08-06T14:56:01","guid":{"rendered":"http:\/\/newblog.mix1009.net\/?p=102"},"modified":"2007-08-06T14:56:01","modified_gmt":"2007-08-06T14:56:01","slug":"xpath-xml-api","status":"publish","type":"post","link":"https:\/\/mix1009.net\/?p=102","title":{"rendered":"XPath &#038; libxml2"},"content":{"rendered":"<p>XML\uc740 \uaf64 \uc624\ub798\uc804\ubd80\ud130 \uc0ac\uc6a9\ud588\uc9c0\ub9cc, \uc5ec\ub7ec\uac00\uc9c0 \ubcf5\uc7a1\ud55c \uc6a9\uc5b4\ub4e4\uc774 \ub098\uc624\uba74\uc11c \uc880 \uba40\uc5b4\uc84c\ub358 \ub290\ub08c\uc774\uc5c8\ub294\ub370, XPath\ub294 \uc815\ub9d0 \ud504\ub85c\uadf8\ub798\uba38\uc5d0\uac8c \uc720\uc6a9\ud55c \ud234\uc778\uac83 \uac19\ub124\uc694.<\/p>\n<p>XPath\ub294 XML \ubb38\uc11c\uc5d0\uc11c \uc27d\uac8c element\ub97c \ucc3e\ub294 API\ub85c \ucffc\ub9ac\ub97c \ubb38\uc790\uc5f4\ub85c \ub118\uae30\uba74 \uc870\uac74\uc5d0 \ub9de\ub294 element\ub098 element \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud558\uac8c \ub429\ub2c8\ub2e4. 1.0 \ubc84\uc804\uc774 \uc788\uace0 2.0 \ubc84\uc804\uc774 \ucd5c\uadfc\uc5d0 \ub098\uc654\uc2b5\ub2c8\ub2e4. \uc544\uc9c1\uae4c\uc9c0\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4\uc774 1.0 \uae30\ubc18\uc774 \ub300\ubd80\ubd84\uc785\ub2c8\ub2e4.<\/p>\n<p>\ucffc\ub9ac\ub294 \uc608\uc81c\ub85c \uc0b4\ud3b4\ubcf4\ub294\uac83\uc774 \ube60\ub978\ub4ef\ud558\ub124\uc694.<\/p>\n<p>&#8220;A\/B\/C&#8221; : A element \ubc11\uc5d0 B element \ubc11\uc5d0 C element\ub4e4\uc740 \ucc3e\uc744\ub54c<br \/>\n&#8220;\/A\/B\/C&#8221; : \uc704\uc640 \uac19\uc9c0\ub9cc A\uac00 \ucd5c\uc0c1\uc704 element.<br \/>\n&#8220;\/A\/B\/C[1]&#8221; : C element\uc911 \uccab\ubc88\uc9f8<br \/>\n&#8220;\/A\/B\/C[2]&#8221; : C element\uc911 \ub450\ubc88\uc9f8<br \/>\n&#8220;\/\/C&#8221; : \ubaa8\ub4e0 C element<br \/>\n&#8220;B\/\/C&#8221; : B \ud558\uc704\uc5d0 \uc788\ub294 C element<br \/>\n&#8220;A\/B\/*&#8221; : A element \ubc11\uc5d0 B element \ubc14\ub85c \ubc11\uc758 \ubaa8\ub4e0 element<br \/>\n&#8220;A\/B\/\/*&#8221; : A element \ubc11\uc5d0 B element \ubc11\uc758 \ubaa8\ub4e0 element (\ud558\uc704 element \ud3ec\ud568)<br \/>\n&#8220;\/\/*&#8221; : \ubb38\uc11c\uc758 \ubaa8\ub4e0 element<\/p>\n<p>libxml2\ub77c\ub294 C \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \uc788\uc9c0\ub9cc python wrapper\ub97c \uc774\uc6a9\ud558\uc5ec python\uc5d0\uc11c \uc704\uc758 \ucffc\ub9ac\ub4e4\uc744 \ub3cc\ub824\ubd24\uc2b5\ub2c8\ub2e4. \ud14c\uc2a4\ud2b8\ud574\ubcf8 \uacb0\uacfc \/\ub85c \uc2dc\uc791\ud558\uc9c0 \uc54a\ub294 \ucffc\ub9ac\ub4e4\uc740 \uc81c\ub300\ub85c \ub3d9\uc791\ud558\uc9c0 \uc54a\ub354\uad70\uc694. (\uac80\uc0c9\ub418\ub294 \uacb0\uacfc\uac00 \uc5c6\uc74c) \uc774\ub7f0 \ucffc\ub9ac\ub4e4\uc740 \uc55e\uc5d0 \/\/\ub97c \ubd99\uc5ec\uc8fc\uba74 \uc81c\ub300\ub85c \ub3d9\uc791\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc544\ub798\ub294 python \uc18c\uc2a4\uc785\ub2c8\ub2e4. \uc911\uac04\uc5d0 \uc608\uc81c XML\uc744 \ubcf4\uae30 \uc88b\uac8c(?) \ub4e4\uc5ec\uc4f0\uae30\ud588\ub1a8\uc9c0\ub9cc \ucd9c\ub825\ud560\ub54c \ud55c\uc904\ub85c \ubcfc\uc218 \uc788\ub3c4\ub85d xml\uc5d0\uc11c \uacf5\ubc31\uacfc newline\uc744 \uc81c\uac70\ud569\ub2c8\ub2e4.<\/p>\n<p>[CODE type=python]<br \/>\nimport libxml2<\/p>\n<p>def xpathElements(ctxt, query):<br \/>\n &nbsp;&nbsp; if query[0] == &#8216;\/&#8217;:<br \/>\n &nbsp; &nbsp; &nbsp;&nbsp; print &#8220;\\&#8221;%s\\&#8221;&#8221; % query<br \/>\n &nbsp;&nbsp; else:<br \/>\n &nbsp; &nbsp; &nbsp;&nbsp; print &#8220;\\&#8221;%s\\&#8221; -&gt; \\&#8221;\/\/%s\\&#8221;&#8221; % (query, query)<br \/>\n &nbsp; &nbsp; &nbsp;&nbsp; query = &#8220;\/\/&#8221; + query<br \/>\n &nbsp;&nbsp; res = ctxt.xpathEval(query)<br \/>\n &nbsp;&nbsp; for e in res:<br \/>\n &nbsp; &nbsp; &nbsp;&nbsp; print &#8221; &nbsp;&nbsp; %s (%s)&#8221; % (e.name, e)<\/p>\n<p>xml = &#8220;&#8221;&#8221;<br \/>\n&lt;A&gt;<br \/>\n &nbsp;&nbsp; &lt;B&gt;<br \/>\n &nbsp; &nbsp; &nbsp;&nbsp; &lt;C id=&#8217;c1&#8217;\/&gt;<br \/>\n &nbsp; &nbsp; &nbsp;&nbsp; &lt;C id=&#8217;c2&#8242;&gt;<br \/>\n &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &lt;D\/&gt;<br \/>\n &nbsp; &nbsp; &nbsp;&nbsp; &lt;\/C&gt;<br \/>\n &nbsp; &nbsp; &nbsp;&nbsp; &lt;E&gt;<br \/>\n &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &lt;F\/&gt;<br \/>\n &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &lt;A&gt;<br \/>\n &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &lt;B&gt;<br \/>\n &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &lt;C\/&gt;<br \/>\n &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &lt;\/B&gt;<br \/>\n &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &lt;\/A&gt;<br \/>\n &nbsp; &nbsp; &nbsp;&nbsp; &lt;\/E&gt;<br \/>\n &nbsp;&nbsp; &lt;\/B&gt;<br \/>\n&lt;\/A&gt;&#8221;&#8221;&#8221;<\/p>\n<p>xml = &#8221;.join([l.strip() for l in xml.splitlines()])<\/p>\n<p>doc = libxml2.parseDoc(xml)<\/p>\n<p>ctxt = doc.xpathNewContext()<\/p>\n<p>xpathElements(ctxt, &#8220;A\/B\/C&#8221;)<br \/>\nxpathElements(ctxt, &#8220;\/A\/B\/C&#8221;)<br \/>\nxpathElements(ctxt, &#8220;\/A\/B\/C[1]&#8221;)<br \/>\nxpathElements(ctxt, &#8220;\/A\/B\/C[2]&#8221;)<br \/>\nxpathElements(ctxt, &#8220;\/A\/B\/C[3]&#8221;)<br \/>\nxpathElements(ctxt, &#8220;\/\/C&#8221;)<br \/>\nxpathElements(ctxt, &#8220;\/\/B\/\/C&#8221;)<br \/>\nxpathElements(ctxt, &#8220;A\/B\/*&#8221;)<br \/>\nxpathElements(ctxt, &#8220;A\/B\/\/*&#8221;)<br \/>\nxpathElements(ctxt, &#8220;\/\/*&#8221;)<br \/>\n[\/HTML][\/CODE]<\/p>\n<p>\ub2e4\uc74c\uc740 \uc2e4\ud589\uacb0\uacfc\uc785\ub2c8\ub2e4.<\/p>\n<div style=\"padding: 10px; background-color: rgb(228, 228, 228)\"><span style=\"font-weight: bold\">&#8220;A\/B\/C&#8221; -&gt; &#8220;\/\/A\/B\/C&#8221;<\/span><br \/>\n &nbsp;&nbsp; C (&lt;C id=&#8221;c1&#8243;\/&gt;)<br \/>\n &nbsp;&nbsp; C (&lt;C id=&#8221;c2&#8243;&gt;&lt;D\/&gt;&lt;\/C&gt;)<br \/>\n &nbsp;&nbsp; C (&lt;C\/&gt;)<br \/>\n<span style=\"font-weight: bold\">&#8220;\/A\/B\/C&#8221;<\/span><br \/>\n &nbsp;&nbsp; C (&lt;C id=&#8221;c1&#8243;\/&gt;)<br \/>\n &nbsp;&nbsp; C (&lt;C id=&#8221;c2&#8243;&gt;&lt;D\/&gt;&lt;\/C&gt;)<br \/>\n<span style=\"font-weight: bold\">&#8220;\/A\/B\/C[1]&#8221;<\/span><br \/>\n &nbsp;&nbsp; C (&lt;C id=&#8221;c1&#8243;\/&gt;)<br \/>\n<span style=\"font-weight: bold\">&#8220;\/A\/B\/C[2]&#8221;<\/span><br \/>\n &nbsp;&nbsp; C (&lt;C id=&#8221;c2&#8243;&gt;&lt;D\/&gt;&lt;\/C&gt;)<br \/>\n<span style=\"font-weight: bold\">&#8220;\/A\/B\/C[3]&#8221;<\/span><br style=\"font-weight: bold\"\/><span style=\"font-weight: bold\">&#8220;\/\/C&#8221;<\/span><br \/>\n &nbsp;&nbsp; C (&lt;C id=&#8221;c1&#8243;\/&gt;)<br \/>\n &nbsp;&nbsp; C (&lt;C id=&#8221;c2&#8243;&gt;&lt;D\/&gt;&lt;\/C&gt;)<br \/>\n &nbsp;&nbsp; C (&lt;C\/&gt;)<br \/>\n<span style=\"font-weight: bold\">&#8220;\/\/B\/\/C&#8221;<\/span><br \/>\n &nbsp;&nbsp; C (&lt;C id=&#8221;c1&#8243;\/&gt;)<br \/>\n &nbsp;&nbsp; C (&lt;C id=&#8221;c2&#8243;&gt;&lt;D\/&gt;&lt;\/C&gt;)<br \/>\n &nbsp;&nbsp; C (&lt;C\/&gt;)<br \/>\n<span style=\"font-weight: bold\">&#8220;A\/B\/*&#8221; -&gt; &#8220;\/\/A\/B\/*&#8221;<\/span><br \/>\n &nbsp;&nbsp; C (&lt;C id=&#8221;c1&#8243;\/&gt;)<br \/>\n &nbsp;&nbsp; C (&lt;C id=&#8221;c2&#8243;&gt;&lt;D\/&gt;&lt;\/C&gt;)<br \/>\n &nbsp;&nbsp; E (&lt;E&gt;&lt;F\/&gt;&lt;A&gt;&lt;B&gt;&lt;C\/&gt;&lt;\/B&gt;&lt;\/A&gt;&lt;\/E&gt;)<br \/>\n &nbsp;&nbsp; C (&lt;C\/&gt;)<br \/>\n<span style=\"font-weight: bold\">&#8220;A\/B\/\/*&#8221; -&gt; &#8220;\/\/A\/B\/\/*&#8221;<\/span><br \/>\n &nbsp;&nbsp; C (&lt;C id=&#8221;c1&#8243;\/&gt;)<br \/>\n &nbsp;&nbsp; C (&lt;C id=&#8221;c2&#8243;&gt;&lt;D\/&gt;&lt;\/C&gt;)<br \/>\n &nbsp;&nbsp; D (&lt;D\/&gt;)<br \/>\n &nbsp;&nbsp; E (&lt;E&gt;&lt;F\/&gt;&lt;A&gt;&lt;B&gt;&lt;C\/&gt;&lt;\/B&gt;&lt;\/A&gt;&lt;\/E&gt;)<br \/>\n &nbsp;&nbsp; F (&lt;F\/&gt;)<br \/>\n &nbsp;&nbsp; A (&lt;A&gt;&lt;B&gt;&lt;C\/&gt;&lt;\/B&gt;&lt;\/A&gt;)<br \/>\n &nbsp;&nbsp; B (&lt;B&gt;&lt;C\/&gt;&lt;\/B&gt;)<br \/>\n &nbsp;&nbsp; C (&lt;C\/&gt;)<br \/>\n<span style=\"font-weight: bold\">&#8220;\/\/*&#8221;<\/span><br \/>\n &nbsp;&nbsp; A (&lt;A&gt;&lt;B&gt;&lt;C id=&#8221;c1&#8243;\/&gt;&lt;C id=&#8221;c2&#8243;&gt;&lt;D\/&gt;&lt;\/C&gt;&lt;E&gt;&lt;F\/&gt;&lt;A&gt;&lt;B&gt;&lt;C\/&gt;&lt;\/B&gt;&lt;\/A&gt;&lt;\/E&gt;&lt;\/B&gt;&lt;\/A&gt;)<br \/>\n &nbsp;&nbsp; B (&lt;B&gt;&lt;C id=&#8221;c1&#8243;\/&gt;&lt;C id=&#8221;c2&#8243;&gt;&lt;D\/&gt;&lt;\/C&gt;&lt;E&gt;&lt;F\/&gt;&lt;A&gt;&lt;B&gt;&lt;C\/&gt;&lt;\/B&gt;&lt;\/A&gt;&lt;\/E&gt;&lt;\/B&gt;)<br \/>\n &nbsp;&nbsp; C (&lt;C id=&#8221;c1&#8243;\/&gt;)<br \/>\n &nbsp;&nbsp; C (&lt;C id=&#8221;c2&#8243;&gt;&lt;D\/&gt;&lt;\/C&gt;)<br \/>\n &nbsp;&nbsp; D (&lt;D\/&gt;)<br \/>\n &nbsp;&nbsp; E (&lt;E&gt;&lt;F\/&gt;&lt;A&gt;&lt;B&gt;&lt;C\/&gt;&lt;\/B&gt;&lt;\/A&gt;&lt;\/E&gt;)<br \/>\n &nbsp;&nbsp; F (&lt;F\/&gt;)<br \/>\n &nbsp;&nbsp; A (&lt;A&gt;&lt;B&gt;&lt;C\/&gt;&lt;\/B&gt;&lt;\/A&gt;)<br \/>\n &nbsp;&nbsp; B (&lt;B&gt;&lt;C\/&gt;&lt;\/B&gt;)<br \/>\n &nbsp;&nbsp; C (&lt;C\/&gt;)\n<\/div>\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>XML\uc740 \uaf64 \uc624\ub798\uc804\ubd80\ud130 \uc0ac\uc6a9\ud588\uc9c0\ub9cc, \uc5ec\ub7ec\uac00\uc9c0 \ubcf5\uc7a1\ud55c \uc6a9\uc5b4\ub4e4\uc774 \ub098\uc624\uba74\uc11c \uc880 \uba40\uc5b4\uc84c\ub358 \ub290\ub08c\uc774\uc5c8\ub294\ub370, XPath\ub294 \uc815\ub9d0 \ud504\ub85c\uadf8\ub798\uba38\uc5d0\uac8c \uc720\uc6a9\ud55c \ud234\uc778\uac83 \uac19\ub124\uc694. XPath\ub294 XML \ubb38\uc11c\uc5d0\uc11c \uc27d\uac8c element\ub97c \ucc3e\ub294 API\ub85c \ucffc\ub9ac\ub97c \ubb38\uc790\uc5f4\ub85c \ub118\uae30\uba74 \uc870\uac74\uc5d0 \ub9de\ub294 element\ub098 element \ub9ac\uc2a4\ud2b8\ub97c \ubc18\ud658\ud558\uac8c \ub429\ub2c8\ub2e4. 1.0 \ubc84\uc804\uc774 \uc788\uace0 2.0 \ubc84\uc804\uc774 \ucd5c\uadfc\uc5d0 \ub098\uc654\uc2b5\ub2c8\ub2e4. \uc544\uc9c1\uae4c\uc9c0\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4\uc774 1.0 \uae30\ubc18\uc774 \ub300\ubd80\ubd84\uc785\ub2c8\ub2e4. \ucffc\ub9ac\ub294 \uc608\uc81c\ub85c \uc0b4\ud3b4\ubcf4\ub294\uac83\uc774 \ube60\ub978\ub4ef\ud558\ub124\uc694. &#8220;A\/B\/C&#8221; : A element \ubc11\uc5d0 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[19],"tags":[91,92,93],"_links":{"self":[{"href":"https:\/\/mix1009.net\/index.php?rest_route=\/wp\/v2\/posts\/102"}],"collection":[{"href":"https:\/\/mix1009.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mix1009.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mix1009.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mix1009.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=102"}],"version-history":[{"count":0,"href":"https:\/\/mix1009.net\/index.php?rest_route=\/wp\/v2\/posts\/102\/revisions"}],"wp:attachment":[{"href":"https:\/\/mix1009.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=102"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mix1009.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=102"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mix1009.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=102"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}