ele
m1
è¦ç´ ã®éåãè¿ãã¾ãã
/elem1
/
)ã§è¡¨ç¾ããXMLææ¸ã®ã«ã¼ãè¦ç´ ï¼ããã¥ã¡ã³ãè¦ç´ ï¼ã¯ãã«ã¼ãã»ãã¼ãã®åã«ãªãã¾ãããã®åã§ããè¦ç´ ãå±æ§ãããã¹ããªã©ã®ãã¼ãã¯ãUNIXç³»ã®ãã¡ã¤ã«ã»ã·ã¹ãã ã®ãã¹ã¨åæ§ã«ãã¹ã©ãã·ã¥ã§åºåã£ã¦é層ãæ示ãã¦åç
§ãã¾ãããã®ä»ã®åãã¼ãéã¯ã親ãåãå
å¼ãªã©ã®é¢ä¿ãæã¤ãã¨ã«ãªãã¾ãã表1ã«ãXPathã§ç´¹ä»ããã¦ãã7ã¤ã®ãã¼ãã®ç¨®é¡ã示ãã¾ããã
ãã¼ãã®ç¨®é¡ | æ¦è¦ | 親 | å |
---|---|---|---|
ã«ã¼ãã»ãã¼ã | ããªã¼æ§é ã®é ç¹ | ãªã | ã«ã¼ãè¦ç´ ãã¼ããå¦çå½ä»¤ãã¼ããã³ã¡ã³ãã»ãã¼ã |
è¦ç´ ãã¼ã | è¦ç´ | è¦ç´ ãã¼ããã«ã¼ãã»ãã¼ã | è¦ç´ ãã¼ããã³ã¡ã³ãã»ãã¼ããå¦çå½ä»¤ãã¼ããããã¹ãã»ãã¼ã |
å±æ§ãã¼ã | å±æ§ | è¦ç´ ãã¼ãï¼ä½ãè¦ç´ ãã¼ãã®åã§ã¯ãªãï¼ | ãªã |
åå空éãã¼ã | åå空é | è¦ç´ ãã¼ãï¼ä½ãè¦ç´ ãã¼ãã®åã§ã¯ãªãï¼ | ãªã |
å¦çå½ä»¤ãã¼ã | å¦çå½ä»¤ | è¦ç´ ãã¼ã | ãªã |
ã³ã¡ã³ãã»ãã¼ã | ã³ã¡ã³ã | è¦ç´ ãã¼ã | ãªã |
ããã¹ãã»ãã¼ã | è¦ç´ ã®å 容æåå | è¦ç´ ãã¼ã | ãªã |
<?å¦çç³» xxxxx
xxxxx?>
ã¨ãããæ¸å¼ã§ãæå®ããå¦çç³»ã®åä½ãæ示çã«æå®ãããã®ã§ããå¦çç³»å´ã«åãåããã¤ã³ã¿ãã§ã¼ã¹ãåãã£ã¦ãããã¨ãåæã¨ãªããXMLããã»ããµã¯ãæªç¥ã®å¦çå½ä»¤ãç¡è¦ãããã¨ã§ãXMLææ¸ã®ãã¼ã¿ããªãã£ã«å½±é¿ãåã°ãªãããã«æ¯èãã¾ããä»»æã®å ´æã«è¨è¿°ãããã¨ãå¯è½ã§ãåºç¾å ´æã«ãã£ã¦ãã«ã¼ãã»ãã¼ãåã¯é©å½ãªè¦ç´ ãã¼ãã¨è¦ªåé¢ä¿ããã¡ã¾ããXMLææ¸ã®åé ã«è¨è¿°ããXML宣è¨ããXMLå¦çç³»ã«å¯¾ããå¦çå½ä»¤ã®ä¸ã¤ã ã¨èãããã¨ãã§ãã¾ãããXPathã§ã¯XML宣è¨ã¯å¦çå½ä»¤ã¨ã¯èããªãã®ã§ãXML宣è¨ã«å¯¾ããå¦çå½ä»¤ãã¼ãã¯åå¨ãã¾ããã
XPathDemo.xml
)
<?xml version="1.0" encoding="UTF-8"?> <address> <item sex="male" custid="E21099"> <name>è äºãå¦</name> <access kind="email"></access> <access kind="url">http://www.nextindex.net/java/</access> <image file="msugai.png" /> </item> <item sex="male" custid="E27989"> <name>é´æ¨ãç«åº</name> <access kind="email">tsuzuki@hoge.foo.bar</access> <image file="tsuzuki.png" /> </item> <item sex="female" custid="E29435"> <name>æ åãå®æ</name> <access kind="tel">090-xxxx-xxxx</access> <image file="tochi.png" /> </item> </address>ãªã¹ã1ã®itemè¦ç´ ã®é ä¸ã®accessè¦ç´ ãæã示ãããã®çµ¶å¯¾ãã±ã¼ã·ã§ã³ã»ãã¹ã®è¨è¿°ã¯æ¬¡ã®ããã«ãªãã¾ãã
/address/item/accessãã®çµæããªã¹ã1ã®ä¾ã§ã¯ããããããã®ã¯4ã¤ã®accessè¦ç´ å ¨ã¦ã¨ãªãã¾ããã«ã¼ãã¨ãã®å ¨ã¦ã®åå«ãã¼ãã®accessè¦ç´ ã«ãããããããã«ã¯ã次ã®ããã«è¨è¿°ãããã¨ãã§ãã¾ãã
//accessãã¡ã¤ã«ãã¹ã¨åæ§ã«ãã¯ã¤ã«ãã«ã¼ãã«ã¢ã¹ã¿ãªã¹ã¯(*)ãæå®ãããã¨ãå¯è½ã§ãã次ã®XPathã¯addressè¦ç´ ã®å ¨ã¦ã®åè¦ç´ ã«ããããã¾ãã
/address/*å¾ã£ã¦ã"
//*
"ã¨ããã°ãå
¨ã¦ã®è¦ç´ ã«ããããããã¨ã«ãªãã¾ãã
ãªã¹ã2ã§ã¯ãXPathãå®éã«å©ç¨ããããã®ã³ã¼ãããJAXPã«ããDOMãã¼ã¹ã®ã³ã¼ãã§ç¤ºãã¾ããã
ãªã¹ã2. XPathã®ãã¹ãç¨ã®ã³ã¼ã(XPathDemo.java
)
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.w3c.dom.traversal.*;
import org.apache.xpath.*;
class XPathDemo {
public static void main(String[] args) {
try {
// DOMãã¼ãµç¨ãã¡ã¯ããªã®çæ
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
// åå空éãèªèãã
factory.setNamespaceAware(true);
// DOM Documentã¤ã³ã¹ã¿ã³ã¹ç¨ãã¡ã¯ããªã®çæ
DocumentBuilder builder = factory.newDocumentBuilder();
// 解æã¨Documentã¤ã³ã¹ã¿ã³ã¹ã®åå¾
Document doc = builder.parse(args[0]);
// NodeIteratorã®åå¾
NodeIterator nl = XPathAPI.selectNodeIterator(doc, args[1]);
int count = 0;
Node n;
while ((n = nl.nextNode()) != null) {
count++;
}
System.out.println("counts: " + count);
} catch (Exception e) {
e.printStackTrace();
}
}
}
ãªã¹ã2ã§ã¯ãååé¨åã§DOMããªã¼ãæ§ç¯ãã¦ãã¾ããDOMããªã¼å
¨ä½ãç¾ãDocumentãã¼ãã®ãªãã¸ã§ã¯ãdocãçæããã¨ããã¾ã§ã¯å
ã®ãã¼ã¸ã§ç´¹ä»ãã¾ãããããã§ã¯ã簡便ã®ããã«å±æ§ã®ã»ãããHandlerã®è¨å®ãªã©ã¯çç¥ãã¦ããã¾ããããã¹ãã®ããã«ã¯åé¡ãªãåä½ãã¾ããå¿
è¦ãããã°ãé©å®è¿½å ãã¦ãã ããã
DOMãã¼ãµã®è¨å®ã®æ¬¡ããXPathç¨APIã®ããã®ã³ã¼ãã§ããXPathã®ä½æ°´æºAPIã§ããorg.apache.xpath.XPathAPIã®staticã¡ã½ããselectNodeIterator()ã®å¼æ°ã«ãDocumentãã¼ãã®ãªãã¸ã§ã¯ãdocã¨ãXPathãåãåãã³ãã³ãã»ã©ã¤ã³å¼æ°aregs[1]ã渡ããorg.w3c.dom.traversal.NodeIteratorãªãã¸ã§ã¯ããçæãã¾ããXPathã¯ä»ã®ä½¿ç¨ã®é¨åã¨ãã¦å©ç¨ãããã¨ã«ãªãããããã®ä¾ã®ããã«ãå¥ãåºãã§æ©è½ãã¤ãããã¨ã¯ç¨ã§ãããããã¯ã©ã¹XPathAPIã«ç¨æãããå°æ°ã®ã¡ã½ããã使ãã°ãã¡ãã£ã¨ãããã¨ã«ã¯ä¾¿å©ã§ãã
ã¯ã©ã¹NodeIteratorã¯ãå¼æ°ã«ã³ã³ããã¹ãã»ãã¼ãã¨XPathãåãåã£ã¦ãããããããã¼ãã®ã»ãããè¿ãã¤ã¿ã¬ã¼ã¿ï¼å復åï¼ã¨ãªãã¾ããã¡ã½ããnextNode()ãpreviousNode()ã§åå¾ã®è¦ç´ ã«ç§»åãã使ãæ¹ã¯ãªã¹ã3ã«æããã¨ããã ãã³ã¬ã¯ã·ã§ã³ã»ã¤ã³ã¿ãã§ã¼ã¹ã®java.util.Iteratorãªã©ã®ã¤ã¿ã¬ã¼ã¿ã¨ã¯ç°ãªããåå¾ã®è¦ç´ ã®åå¨å¤å®ã¨ç§»åãåæã«è¡ããããã¨ã«æ³¨æãå¿
è¦ã§ãã
ãªã¹ã2ã®"XPathDemo.java
"ã¨ãªã¹ã1ã®XMLææ¸"XPathDemo.
xml
"ãåãå ´æã«ä¿åãã¦å®è¡ãã¦ã¿ã¾ããããä½ãã"XPathDemo.xml
"ã¯ãUTF-8ã§ä¿åããå¿
è¦ãããã¾ããä»ã®æå符å·åæ¹æ³ã使ãå ´åã¯ãXML宣è¨ãé©å®æ¸ãæããªããã°ãªãã¾ããã
å®è¡çµæã¯æ¬¡ã®ããã«ãªãã¾ããXMLææ¸ãXPathãé©å½ã«æ¸ãæãã¦ãåä½ã確èªãã¦ãã ããã第ä¸å¼æ°ã«ã¯XMLææ¸ã®ãã¹ãæå®ãã第äºå¼æ°ãXPathãæå®ãã¾ãã
>javac XPathDemo.java >java XPathDemo XPathDemo.xml /address/item/access counts: 4 >java XPathDemo XPathDemo.xml //access counts: 4 >java XPathDemo XPathDemo.xml /address/* counts: 3 >java XPathDemo XPathDemo.xml //* counts: 14
軸::ãã¼ãã»ãã¹ã[è¿°èª]å ã«æãããã±ã¼ã·ã§ã³ãã¹ã¯ããããã®æå®ãçç¥ããè¨æ³ã§ããä¾ãã°ã"
/address/item/access
"ã¯ãçç¥ããªãã§æ¸ãã¨ã次ã®ããã«ãªãã¾ãã
/child::address/child::address/child::access
ancestor | èªåã®ç¥å ãã¼ã |
---|---|
ancestor-or-self | èªåèªèº«ã¨ãã®ç¥å |
attribute | èªåã®å±æ§ãã¼ã |
child | åãã¼ã |
descendant | èªåã®åå«ãã¼ã |
descendant-or-self | èªåèªèº«ã¨ãã®åå« |
following | å¾ç¶ããå ¨ã¦ã®ãã¼ã |
following-sibling | èªåããå¾ç¶ã®å å¼ |
namespace | èªåã®åå空éãã¼ã |
parent | 親ãã¼ã |
preceding | å è¡ããå ¨ã¦ã®ãã¼ã |
preceding-sibling | èªåããå è¡ããå å¼ |
self | èªåèªèº« |
//
ã¯de
scendant-or-self
ãæå³ããçç¥è¨æ³ã§ãã
çç¥è¨æ³ | çç¥ããªãè¨æ³ |
---|---|
ä½ãè¨è¿°ããªã | child |
@ | attribute |
. | self |
.. | parent |
// | descendant-or-self |
XPathDem
o.xml
)ã§ãitemè¦ç´ ã®sexå±æ§ãæå®ããã«ã¯ã次ã®ä½ããã®è¨è¿°ãå¯è½ã§ãã
/child::address/child::item/attribute::sexåã¯ã
/address/item/@sex
*
ããã¼ãã»ãã¹ãã®ç¹æ®ãªãã®ã®ä¸ã¤ã§ãã
comment() | ã³ã¡ã³ãã»ãã¼ã |
---|---|
text() | ããã¹ãã»ãã¼ã |
processing-instruction() | å¦çå½ä»¤ãã¼ã |
node() | ãã¼ãã»ã¿ã¤ãã«å¯ããªãå ¨ã¦ã®ãã¼ã |
* | 軸ã®æå®ãããã¼ãã»ã¿ã¤ãã«ãããããå ¨ã¦ã®ãã¼ã |
/address/item/name/text()
XPathAPI
ã®ã¡ã½ããeval()
ã«ãã£ã¦ãåã¤ã®åãè¿ããã¾ãã
org.apache.xpath.objects.XObject | +--org.apache.xpath.objects.XNodeSet | +--org.apache.xpath.objects.XString | +--org.apache.xpath.objects.XBoolean | +--org.apache.xpath.objects.XNumberãªã¹ã3ã¯ã第ä¸å¼æ°ã«XMLææ¸ã®ãã¹ã第äºå¼æ°ã«XPathãæå®ãã¦ãè©ä¾¡çµæã«å¿ããåãåºåãããã®ã§ãã ãªã¹ã3. XPathã®ãã¼ãã»ã¿ã¤ããåºå(
XPathTypeDemo.
java
)
import java.io.*; import javax.xml.parsers.*; import org.w3c.dom.*; import org.w3c.dom.traversal.*; import org.apache.xpath.*; import org.apache.xpath.objects.*; class XPathTypeDemo { public static void main(String[] args) { try { // DOMãã¼ãµç¨ãã¡ã¯ããªã®çæ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); // åå空éãèªèãã factory.setNamespaceAware(true); // DOM Documentã¤ã³ã¹ã¿ã³ã¹ç¨ãã¡ã¯ããªã®çæ DocumentBuilder builder = factory.newDocumentBuilder(); // 解æã¨Documentã¤ã³ã¹ã¿ã³ã¹ã®åå¾ Document doc = builder.parse(args[0]); // NObjectã®åå¾ XObject xobj = XPathAPI.eval(doc, args[1]); System.out.println(xobj.getTypeString()); if (xobj instanceof XNodeSet) { System.out.println(args[1] + " is XNodeSet."); } else if (xobj instanceof XString) { System.out.println(args[1] + " is XString."); } else if (xobj instanceof XBoolean) { System.out.println(args[1] + " is XBoolean."); } else if (xobj instanceof XNumber) { System.out.println(args[1] + "is XNumber."); } else { System.out.println(args[1] + "is unkown."); } } catch (Exception e) { e.printStackTrace(); } } }ä¾ãã°ããã±ã¼ã·ã§ã³ã»ãã¹ã第äºå¼æ°ã«ä¸ããã°
XNodeSetãè¿ããã¾ãã
åæ§ã«ããã¼ããæå
åã«å¤æããé¢æ°string()
ãæå®ããã°XString
ãè¿ã
ãããã¼ãã«å«ã¾ãã
ãã¼ãã®ç·æ°ãè¿ãlast()
ãæå®ããã°XNumber
ãè¿ã
ãããã¨ã«ãªãã¾ãã
>javac XPathTypeDemo.java >java XPathTypeDemo XPathDemo.xml /address/item #NODESET /address/item is XNodeSet. >java XPathTypeDemo XPathDemo.xml string() #STRING string() is XString. >java XPathTypeDemo XPathDemo.xml last() #NUMBER last()is XNumber.string()ãlast()以å¤ã«ããXPathã§ã¯ããããã®åã«å¿ãã¦ããã±ã¼ã·ã§ã³ã»ã¹ãããã§å©ç¨ããããã®ãå¤ãã®é¢æ°ãç¨æããã¦ãã¾ãã表5ã¨6ã«ãå©ç¨ã§ãã代表çãªé¢æ°ã¨æ¼ç®åãè¼ãã¾ããããã詳細ãªå®ç¾©ã¯W3Cã®XPath 1.0ä»æ§æ¸ããåç §ãã ããã 次ã«æããã®ã¯ãXPathä»æ§ã§å®ç¾©ããã¦ããé¢æ°ã®ãã¡ãæ¯è¼çè¯ã使ãã§ãããç©ã§ãã
ãã¼ãéåé¢æ° | æ°å¤ last() | é©åãããã¼ãã®æ° |
---|---|---|
æ°å¤ position() | ãã¼ãéåã®ä¸ã®ãã¼ãçªå· | |
æ°å¤ count(ãã¼ãéå) | å¼æ°ã®ãã¼ãéåã®ä¸ã®ãã¼ãæ° | |
æåå local-name(ãã¼ãéå?) | å¼æ°ã®ãã¼ãéåã®æåã®ãã¼ãã®å±æå | |
æåå namespace-uri(ãã¼ãéå?) | å¼æ°ã®ãã¼ãéåã®æåã®ãã¼ãã®åå空éURI | |
æåå name(ãã¼ãéå?) | å¼æ°ã®ãã¼ãéåã®æåã®ãã¼ãã®åå空é修飾ãããå±éå | |
æååé¢æ° | æåå string(ãªãã¸ã§ã¯ã) | å¼æ°ã«å¯¾å¿ããæåå |
æåå concat(æåå,æåå,æåå*) | å¼æ°ã®æååãçµåããæåå | |
ãã¼ãªã¢ã³ start-with(æåå,æåå) | 第ä¸å¼æ°ã®æååã第äºå¼æ°ã®æååã§å§ã¾ãå ´åã«trueãè¿ã | |
ãã¼ãªã¢ã³ contains(æåå,æåå) | 第ä¸å¼æ°ã®æååã第äºå¼æ°ã®æååãå«ãå ´åã«trueãè¿ã | |
æåå substring(æåå,æ°å¤,æ°å¤?) | 第ä¸å¼æ°ã®æååã®ã第äºå¼æ°ã®ç®æã§å§ã¾ãã第ä¸å¼æ°ã®é·ãã®é¨åæåå | |
æ°å¤ string-length(æåå?) | å¼æ°ã®æååã®é·ã | |
æåå normalize-space(æåå) | å¼æ°ã®æååã®åå¾ã®ç©ºç½ãé¤å»ããé£ç¶ãã空ç½ãä¸ã¤ã«ã¾ã¨ããæåå | |
ãã¼ãªã¢ã³é¢æ° | ãã¼ãªã¢ã³ boolean(ãªãã¸ã§ã¯ã?) | å¼æ°ã«å¯¾å¿ãããã¼ãªã¢ã³å¤ |
ãã¼ãªã¢ã³ not(ãã¼ãªã¢ã³) | å¼æ°ã®çã«å¯¾ãã¦å½ããå½ã«å¯¾ãã¦çãè¿ã | |
ãã¼ãªã¢ã³ true() | 常ã«çãè¿ã | |
ãã¼ãªã¢ã³ false() | 常ã«å½ãè¿ã | |
æ°å¤é¢æ° | æ°å¤ number(ãªãã¸ã§ã¯ã?) | å¼æ°ã«å¯¾å¿ããæ°å¤ãè¿ã |
æ°å¤ sum(ãã¼ãéå) | å¼æ°ã®ãã¼ãéåãæååã«å¤æããçµæãæ°å¤ã«å¤æãããã®åãè¿ã | |
æ°å¤ floor(æ°å¤) | å¼æ°ä»¥ä¸ã®æ大ã®æ´æ°ãè¿ã | |
æ°å¤ ceiling(æ°å¤) | å¼æ°ä»¥ä¸ã®æå°ã®æ´æ°ãè¿ã | |
æ°å¤ round(æ°å¤) | å¼æ°ãåæ¨äºå ¥ããæ´æ°ãè¿ã |
AND | ã㤠|
OR | ã¾ã㯠|
= | çå· |
!= | ä¸çå· |
< | å°ãªã |
<= | å°ãªãã¤ã³ã¼ã« |
> | 大ãªã |
>= | 大ãªãã¤ã³ã¼ã« |
sex="male"
ã§ããit
em
è¦ç´ ã®åè¦ç´ ã§ããnam
e
è¦ç´ ã®å
容æååããæã示ãã«ã¯ã次ã®ããã«è¨è¿°ãã¾ãã
/address/item[@sex='male']/name/text()ä»æ§ã¨ãã¦ã¯äºéå¼ç¨ç¬¦ã§ãè¯ãã¯ãã§ãããXalanã¯ä¸éå¼ç¨ç¬¦ã§ãªããã°ãããããã¨ã¿ãªãã¾ãããXSLTã§ã¯ãå±æ§matchãselectã¨ãã£ããXSLTææ¸å ã®è¦ç´ ã®ããªãããã®å±æ§ã®å¤ã¨ãã¦ãå°ãäºéå¼ç¨ç¬¦ã®ä¸ã§ä½¿ãã®ã§ããã°ãä¸éå¼ç¨ç¬¦ã使ãå¿ è¦ãããã¾ãã
address
è¦ç´ ã®æå¾ã®item
åè¦ç´ ã®access
è¦ç´ ã¯æ¬¡ã®ããã«æå®ãã¾ãã
/address/item[position()=last()]/accessåã¯ã
/address/item[last()]/access