{"id":3635,"date":"2012-08-13T11:07:20","date_gmt":"2012-08-13T02:07:20","guid":{"rendered":"http:\/\/www.moonmile.net\/blog\/archives\/3635"},"modified":"2012-08-13T11:09:25","modified_gmt":"2012-08-13T02:09:25","slug":"c-xnode-%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6-xnavigator-%e3%82%92%e4%bd%9c%e3%82%8b","status":"publish","type":"post","link":"http:\/\/www.moonmile.net\/blog\/archives\/3635","title":{"rendered":"[C#] XNode \u3092\u4f7f\u3063\u3066 XNavigator \u3092\u4f5c\u308b"},"content":{"rendered":"<p>\n [C#] XElement \u3068\u306f\u9055\u3046 LINQ \u3067\u304d\u308b XmlNode \u3092\u4f5c\u6210\u3059\u308b | Moonmile Solutions Blog<br \/>\n<a href=\"http:\/\/www.moonmile.net\/blog\/archives\/3628\">http:\/\/www.moonmile.net\/blog\/archives\/3628<\/a>\n<\/p>\n<p>\n\u306a\u3068\u3053\u308d\u3067\u3001\u81ea\u524d\u306e XmlNode \u3092\u4f7f\u3063\u3066 LINQ \u64cd\u4f5c\u3092\u5b9f\u73fe\u3057\u305f\u8a33\u3067\u3059\u304c\u3001XNode \u3068\u306e\u91cd\u8907\u304c\u6fc0\u3057\u3044\u306e\u3067\u3001\u8a66\u3057\u306b System.Xml.Linq.XNode http:\/\/msdn.microsoft.com\/ja-jp\/library\/system.xml.linq.xnode.aspx \u3092\u4f7f\u3063\u3066\u66f8\u304d\u76f4\u3057\u3066\u307f\u307e\u3059\u3001\u3063\u3066\u3044\u3046\u5b9f\u9a13\u3092\u3002\n<\/p>\n<p>\n\u25a0XNavigator\u3092\u5b9f\u88c5\u3002\n<\/p>\n<p>\n\u81ea\u524d\u306e XmlNavigator \u3092\u305d\u306e\u307e\u307e\u30b3\u30d4\u30da\u3057\u3066\u5b9f\u88c5\u3057\u76f4\u3057\u307e\u3059\u3002<br \/>\n\u3044\u304f\u3064\u304b\u306e\u30e1\u30bd\u30c3\u30c9\u540d\u3092\u5909\u66f4\u3057\u307e\u3059\u304c\u3001\u305d\u306e\u307e\u307e\u3067\u3059\u3093\u306a\u308a\u30b3\u30f3\u30d1\u30a4\u30eb\u304c\u901a\u308a\u307e\u3059\u3002\n<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\npublic class XNavigator : IEnumerable&lt;XNode&gt;\r\n{\r\n\tXNode _root;\r\n\r\n\tpublic XNavigator(XNode root)\r\n\t{\r\n\t\t_root = root;\r\n\t}\r\n\r\n\tpublic IEnumerator&lt;XNode&gt; GetEnumerator()\r\n\t{\r\n\t\treturn new Enumerator(_root);\r\n\t}\r\n\r\n\tSystem.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n\t{\r\n\t\treturn new Enumerator(_root);\r\n\t}\r\n\r\n\tprotected class Enumerator : IEnumerator&lt;XNode&gt;\r\n\t{\r\n\t\tXNode _root;\r\n\t\tXNode _cur;\r\n\r\n\t\tpublic Enumerator(XNode root)\r\n\t\t{\r\n\t\t\t_root = root;\r\n\t\t}\r\n\r\n\t\tpublic XNode Current\r\n\t\t{\r\n\t\t\tget { return _cur; }\r\n\t\t}\r\n\r\n\t\tpublic void Dispose()\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tobject System.Collections.IEnumerator.Current\r\n\t\t{\r\n\t\t\tget { return _cur; }\r\n\t\t}\r\n\r\n\t\tpublic bool MoveNext()\r\n\t\t{\r\n\t\t\tif (_cur == null)\r\n\t\t\t{\r\n\t\t\t\t_cur = _root;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif (_cur.NodeType == System.Xml.XmlNodeType.Element &amp;&amp;\r\n\t\t\t\t((XElement)_cur).Nodes().Count() &gt; 0)\r\n\t\t\t{\r\n\t\t\t\t_cur = ((XElement)_cur).FirstNode;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif (_cur.NextNode != null)\r\n\t\t\t{\r\n\t\t\t\t_cur = _cur.NextNode;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tXNode cur = _cur;\r\n\t\t\twhile (true)\r\n\t\t\t{\r\n\t\t\t\tXElement pa1 = cur.Parent;\r\n\t\t\t\tif (pa1 == null)\r\n\t\t\t\t{\r\n\t\t\t\t\t_cur = null;\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif (pa1.NextNode != null)\r\n\t\t\t\t{\r\n\t\t\t\t\t_cur = pa1.NextNode;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tcur = pa1;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic void Reset()\r\n\t\t{\r\n\t\t\t_cur = null;\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>\n\u25a0\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u3092\u66f8\u304f\n<\/p>\n<p>\nXmlNavigator \u7528\u306b\u66f8\u3044\u305f\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u3092 XNavigator \u7528\u306b\u76f4\u3057\u307e\u3059\u3002\n<\/p>\n<ul>\n<li>XML \u69cb\u7bc9\u306e\u3068\u3053\u308d\u306f\u3001XDocument \u3092\u4f7f\u3063\u3066\u66f8\u304d\u63db\u3048\u3002<\/li>\n<li>XNode \u306e\u307e\u307e\u3067\u306f Where \u30e1\u30bd\u30c3\u30c9\u3067\u3046\u307e\u304f\u52d5\u304b\u306a\u3044\u306e\u3067\u3001\u3061\u3087\u3063\u3068\u601d\u6848<\/li>\n<\/ul>\n<p>\n\u3068\u3044\u3046\u5177\u5408\u3067\u3059\u3002\n<\/p>\n<p>\nXNode \u306e\u307e\u307e\u3060\u3068\u3001\u5b9f\u306f Nodes \u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u3068\u304b\u304c\u7121\u3044\u3093\u3067\u3059\u3088\u306d&#8230;\u3053\u306e\u3042\u305f\u308a\u3001DOM \u306e\u9803\u304b\u3089\u305d\u3046\u306a\u306e\u3067\u3059\u304c\u3001\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3092\u91cd\u8996\u3059\u308b\u3042\u307e\u308a\u3001\u5229\u7528\u3059\u308b\u6642\u306b XElement \u306b\u30ad\u30e3\u30b9\u30c8\u3092\u3057\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u3068\u3044\u3046\u7f60\u304c\u3042\u308a\u307e\u3059\u3002<br \/>\nXNavigator \u81ea\u4f53\u306f\u3001XElement, XText \u306a\u3069\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3082\u8fd4\u3059\u306e\u3067\u3001\u3053\u306e TagName \u3084 Value \u5f53\u305f\u308a\u304c\u9b3c\u9580\u3068\u306a\u308a\u307e\u3059\u3002\n<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\t&#x5B;TestClass]\r\n\tpublic class TestXNavi\r\n\t{\r\n\t\t&#x5B;TestMethod]\r\n\t\tpublic void TestNormal1()\r\n\t\t{\r\n\t\t\tXDocument doc = new XDocument(\r\n\t\t\t\tnew XElement(&amp;quot;root&amp;quot;,\r\n\t\t\t\t\tnew XElement(&amp;quot;person&amp;quot;,\r\n\t\t\t\t\t\tnew XElement(&amp;quot;name&amp;quot;, &amp;quot;masuda&amp;quot;))));\r\n\r\n\t\t\tvar q = new XNavigator(doc.FirstNode)\r\n\t\t\t\t.Where(n =&gt; n.TagName() == &amp;quot;name&amp;quot;)\r\n\t\t\t\t.FirstOrDefault();\r\n\t\t\tAssert.AreEqual(&amp;quot;masuda&amp;quot;, q.Value());\r\n\r\n\t\t}\r\n\t\t\r\n\t\t&#x5B;TestMethod]\r\n\t\tpublic void TestNormal2()\r\n\t\t{\r\n\t\t\tXDocument doc = new XDocument(\r\n\t\t\t\tnew XElement(&amp;quot;root&amp;quot;,\r\n\t\t\t\t\tnew XElement(&amp;quot;person&amp;quot;,\r\n\t\t\t\t\t\tnew XElement(&amp;quot;name&amp;quot;, &amp;quot;masuda&amp;quot;),\r\n\t\t\t\t\t\tnew XElement(&amp;quot;name&amp;quot;, &amp;quot;yamada&amp;quot;),\r\n\t\t\t\t\t\tnew XElement(&amp;quot;name&amp;quot;, &amp;quot;yamasaki&amp;quot;))));\r\n\r\n\t\t\t\/\/ \u30bf\u30b0\u304c\u691c\u7d22\u3067\u304d\u305f\u5834\u5408\r\n\t\t\tvar q = new XNavigator(doc.FirstNode)\r\n\t\t\t\t.Where(n =&gt; n.TagName() == &amp;quot;name&amp;quot;)\r\n\t\t\t\t.Select( n =&gt; n );\r\n\r\n\t\t\tAssert.AreEqual(3, q.Count());\r\n\t\t\tAssert.AreEqual(&amp;quot;masuda&amp;quot;, q.First().Value());\r\n\t\t}\r\n\r\n\t\t&#x5B;TestMethod]\r\n\t\tpublic void TestNormal3()\r\n\t\t{\r\n\t\t\tXDocument doc = new XDocument(\r\n\t\t\t\tnew XElement(&amp;quot;root&amp;quot;,\r\n\t\t\t\t\tnew XElement(&amp;quot;person&amp;quot;,\r\n\t\t\t\t\t\tnew XAttribute(&amp;quot;id&amp;quot;, &amp;quot;1&amp;quot;),\r\n\t\t\t\t\t\tnew XElement(&amp;quot;name&amp;quot;, &amp;quot;masuda&amp;quot;),\r\n\t\t\t\t\t\tnew XElement(&amp;quot;age&amp;quot;,&amp;quot;44&amp;quot;)),\r\n\t\t\t\t\tnew XElement(&amp;quot;person&amp;quot;,\r\n\t\t\t\t\t\tnew XAttribute(&amp;quot;id&amp;quot;, &amp;quot;2&amp;quot;),\r\n\t\t\t\t\t\tnew XElement(&amp;quot;name&amp;quot;, &amp;quot;yamada&amp;quot;),\r\n\t\t\t\t\t\tnew XElement(&amp;quot;age&amp;quot;,&amp;quot;20&amp;quot;)),\r\n\t\t\t\t\tnew XElement(&amp;quot;person&amp;quot;,\r\n\t\t\t\t\t\tnew XAttribute(&amp;quot;id&amp;quot;, &amp;quot;3&amp;quot;),\r\n\t\t\t\t\t\tnew XElement(&amp;quot;name&amp;quot;, &amp;quot;tanaka&amp;quot;),\r\n\t\t\t\t\t\tnew XElement(&amp;quot;age&amp;quot;,&amp;quot;10&amp;quot;))));\r\n\r\n\t\t\t\/\/ \u30bf\u30b0\u304c\u691c\u7d22\u3067\u304d\u305f\u5834\u5408\r\n\t\t\tvar q = new XNavigator(doc.FirstNode)\r\n\t\t\t\t.Where(n =&gt; n.Attrs(&amp;quot;id&amp;quot;) == &amp;quot;2&amp;quot;)\r\n\t\t\t\t.FirstOrDefault();\r\n\t\t\tAssert.AreEqual(&amp;quot;person&amp;quot;, q.TagName());\r\n\t\t\t\/\/ \u62e1\u5f35\u30e1\u30bd\u30c3\u30c9\u3092\u5229\u7528\r\n\t\t\tAssert.AreEqual(&amp;quot;yamada&amp;quot;, q.Child(&amp;quot;name&amp;quot;).Value());\r\n\t\t\tAssert.AreEqual(&amp;quot;20&amp;quot;, q.Child(&amp;quot;age&amp;quot;).Value());\r\n\t\t}\r\n\t\t\r\n\t\t&#x5B;TestMethod]\r\n\t\tpublic void TestNormal4()\r\n\t\t{\r\n\t\t\tXDocument doc = new XDocument(\r\n\t\t\t\tnew XElement(&amp;quot;root&amp;quot;,\r\n\t\t\t\t\tnew XElement(&amp;quot;person&amp;quot;,\r\n\t\t\t\t\t\tnew XAttribute(&amp;quot;id&amp;quot;, &amp;quot;1&amp;quot;),\r\n\t\t\t\t\t\tnew XElement(&amp;quot;name&amp;quot;, &amp;quot;masuda&amp;quot;),\r\n\t\t\t\t\t\tnew XElement(&amp;quot;age&amp;quot;,&amp;quot;44&amp;quot;)),\r\n\t\t\t\t\tnew XElement(&amp;quot;person&amp;quot;,\r\n\t\t\t\t\t\tnew XAttribute(&amp;quot;id&amp;quot;, &amp;quot;2&amp;quot;),\r\n\t\t\t\t\t\tnew XElement(&amp;quot;name&amp;quot;, &amp;quot;yamada&amp;quot;),\r\n\t\t\t\t\t\tnew XElement(&amp;quot;age&amp;quot;,&amp;quot;20&amp;quot;)),\r\n\t\t\t\t\tnew XElement(&amp;quot;person&amp;quot;,\r\n\t\t\t\t\t\tnew XAttribute(&amp;quot;id&amp;quot;, &amp;quot;3&amp;quot;),\r\n\t\t\t\t\t\tnew XElement(&amp;quot;name&amp;quot;, &amp;quot;tanaka&amp;quot;),\r\n\t\t\t\t\t\tnew XElement(&amp;quot;age&amp;quot;,&amp;quot;10&amp;quot;))));\r\n\r\n\r\n\t\t\t\/\/ \u30af\u30a8\u30ea\u6587\u306b\u3057\u3066\u307f\u308b\r\n\t\t\tvar q = from n in new XNavigator(doc.FirstNode)\r\n\t\t\t\t\twhere n.Attrs(&amp;quot;id&amp;quot;) == &amp;quot;2&amp;quot;\r\n\t\t\t\t\tselect n;\r\n\r\n\t\t\tAssert.AreEqual(&amp;quot;person&amp;quot;, q.First().TagName());\r\n\t\t\t\/\/ \u62e1\u5f35\u30e1\u30bd\u30c3\u30c9\u3092\u5229\u7528\r\n\t\t\tAssert.AreEqual(&amp;quot;yamada&amp;quot;, q.First().Child(&amp;quot;name&amp;quot;).Value());\r\n\t\t\tAssert.AreEqual(&amp;quot;20&amp;quot;, q.First().Child(&amp;quot;age&amp;quot;).Value());\r\n\t\t}\r\n\r\n\t}\r\n<\/pre>\n<p>\n\u25a0\u62e1\u5f35\u30e1\u30bd\u30c3\u30c9\u3092\u8ffd\u52a0\u3059\u308b\n<\/p>\n<p>\n\u3067\u3001\u666e\u901a\u306b\u3084\u308b\u3068\u65ad\u5ff5\u3057\u3066\u3057\u307e\u3046\u306e\u3067&#8230;\u7121\u7406\u77e2\u7406\u3001XNode \u306b\u62e1\u5f35\u30e1\u30bd\u30c3\u30c9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<br \/>\n\u672c\u6765\u306f\u3001TagName \u30d7\u30ed\u30d1\u30c6\u30a3\u3001Value \u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u3088\u3046\u306b\u300c\u30d7\u30ed\u30d1\u30c6\u30a3\u300d\u306b\u3057\u305f\u3044\u306e\u3067\u3059\u304c\u3001\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u62e1\u5f35\u30e1\u30bd\u30c3\u30c9\u306f\u3067\u304d\u306a\u3044\u306e\u3067 TagName() \u30e1\u30bd\u30c3\u30c9\u3001Value() \u30e1\u30bd\u30c3\u30c9\u306b\u3057\u307e\u3059\u3002\n<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\t\/\/\/ &lt;summary&gt;\r\n\t\/\/\/ XNode\u3092XElement\u98a8\u306b\u4f7f\u3046\u62e1\u5f35\u30af\u30e9\u30b9\r\n\t\/\/\/ &lt;\/summary&gt;\r\n\tpublic static class XNodeExtentions\r\n\t{\r\n\t\tpublic static string TagName(this XNode n)\r\n\t\t{\r\n\t\t\tif (n.NodeType == System.Xml.XmlNodeType.Element)\r\n\t\t\t{\r\n\t\t\t\treturn ((XElement)n).Name.ToString();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\treturn &amp;quot;&amp;quot;;\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic static string Value(this XNode n)\r\n\t\t{\r\n\t\t\tif (n.NodeType == System.Xml.XmlNodeType.Element)\r\n\t\t\t{\r\n\t\t\t\treturn ((XElement)n).Value;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\treturn &amp;quot;&amp;quot;;\r\n\t\t\t}\r\n\t\t}\r\n\t\tpublic static string Attrs(this XNode n, string key)\r\n\t\t{\r\n\t\t\tif (n.NodeType == System.Xml.XmlNodeType.Element)\r\n\t\t\t{\r\n\t\t\t\tvar attr = ((XElement)n).Attribute(key);\r\n\t\t\t\tif ( attr != null ) {\r\n\t\t\t\t\treturn attr.Value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn &amp;quot;&amp;quot;;\r\n\t\t}\r\n\t\tpublic static XNode Child(this XNode nd, string tag)\r\n\t\t{\r\n\t\t\tif (nd.NodeType == System.Xml.XmlNodeType.Element)\r\n\t\t\t{\r\n\t\t\t\treturn ((XElement)nd).Nodes().Where(n =&gt; n.TagName() == tag).FirstOrDefault();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t\r\n\t}\r\n<\/pre>\n<p>\n\u3059\u308b\u3068\u3001\u4e0a\u8a18\u306e\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u304c\u901a\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002\n<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n\tvar q = new XNavigator(doc.FirstNode)\r\n\t\t.Where(n =&gt; n.TagName() == &amp;quot;name&amp;quot;)\r\n\t\t.FirstOrDefault();\r\n\tAssert.AreEqual(&amp;quot;masuda&amp;quot;, q.Value());\r\n<\/pre>\n<p>\n\u30e9\u30e0\u30c0\u5f0f\u306e\u4e2d\u306e n \u304c XNode \u306a\u306e\u3067\u3001TagName() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3044\u307e\u3059\u3001\u3063\u3066\u306a\u5177\u5408\u3002XElement \u306e\u5834\u5408\u306f Value \u30d7\u30ed\u30d1\u30c6\u30a3\u306b\u306a\u308b\u8a33\u3067\u3001\u3053\u3053\u306e\u3068\u3053\u308d\u3001\n<\/p>\n<ul>\n<li>XNode.Value() \u30e1\u30bd\u30c3\u30c9<\/li>\n<li>XElement.Value \u30d7\u30ed\u30d1\u30c6\u30a3<\/li>\n<\/ul>\n<p>\n\u3068\u3044\u3046\u300c\u30e1\u30bd\u30c3\u30c9\u540d\u3068\u30d7\u30ed\u30d1\u30c6\u30a3\u540d\u304c\u540c\u3058\u300d\u3068\u3044\u3046\uff08\u591a\u5206\uff09VB \u3067\u306f\u4f7f\u3048\u306a\u3044\u30e1\u30bd\u30c3\u30c9\u304c\u4f5c\u3089\u308c\u3066\u3044\u307e\u3059\u304c\u3001\u307e\u3042\u826f\u3057\u3068\u3057\u307e\u3057\u3087\u3046\uff08\u5f8c\u3067\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3059\u304b\uff09\u3002\n<\/p>\n<p>\n\u3053\u3046\u3059\u308b\u3068\u3001XDocument \u3082\u30c4\u30ea\u30fc\u69cb\u9020\u3067\u30b5\u30fc\u30c1\u304c\u3067\u304d\u308b\u306e\u3067\u30b3\u30fc\u30c9\u304c\u7c21\u5358\u306b\u306a\u308a\u307e\u3059\u306d\u3002\u3063\u3066\u8a71\u3067\u3002<br \/>\n\u81ea\u524d\u306e XmlNode \u3067\u3082\u3044\u3044\u3093\u3060\u3051\u3069\u3001node \/ &#8220;tag&#8221; \u306e\u3088\u3046\u306a\u66f8\u304d\u65b9\u304c\u3067\u304d\u306a\u3044\u304b\u3089\u3001\u3069\u3046\u3057\u3088\u3046\u304b\u306d\u3001\u3063\u3066\u5177\u5408\u3067\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>[C#] XElement \u3068\u306f\u9055\u3046 LINQ \u3067\u304d\u308b XmlNode \u3092\u4f5c\u6210\u3059\u308b | Moonmile Solutions Blog http:\/\/www.moonmile.net\/blog\/archives\/3628 &hellip; <a href=\"http:\/\/www.moonmile.net\/blog\/archives\/3635\">\u7d9a\u304d\u3092\u8aad\u3080 <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[23,47],"tags":[],"class_list":["post-3635","post","type-post","status-publish","format-standard","hentry","category-csharp","category-xmldom"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/3635","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/comments?post=3635"}],"version-history":[{"count":2,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/3635\/revisions"}],"predecessor-version":[{"id":3637,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/posts\/3635\/revisions\/3637"}],"wp:attachment":[{"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/media?parent=3635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/categories?post=3635"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.moonmile.net\/blog\/wp-json\/wp\/v2\/tags?post=3635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}