XPath Sınıfı
Şu satırı dahil
ederiz.
import javax.xml.xpath.*;
constructor
XPathFactory ile yaratılır. Şöyle
yaparız.
XPath xpath = XPathFactory.newInstance().newXPath();
compile metodu
Sonra çalıştırılmak üzer bir XPathExpression nesnesi döner. Şöyle
yaparız.
xPath.compile("/soap:Fault/faultcode/text()[1]")
evaluate metodu - Document
Şöyle yaparız.
Document doc = ...;
XPath xPath = XPathFactory.newInstance().newXPath();
String faultCode = xPath.compile("/soap:Fault/faultcode/text()[1]").evaluate(doc);
evaluate metodu - InputSource
InputSource nesnesini kullanarak bir data model oluşturur. Daha sonra verilen ifadeyi çalıştırıp bir sonuç döner. Sonuç Node listesi , tek bir Node veya string olabilir.
Node listesi için şöyle
yaparız.
InputStream is = ...;
InputSource inputSrc = new InputSource(is);
XPath xpath = XPathFactory.newInstance().newXPath();
String expression = ... ;
NodeList nodes = (NodeList) xpath.evaluate(expression,
inputSrc, XPathConstants.NODESET);
Tek bir Node için şöyle yaparız.
Node node = (Node) xpath.evaluate(expression,
inputSrc,
XPathConstants.NODE);
String için şöyle
yaparız. Örneğin bir attribute çekmek isteyelim.
String platformTag = (String) xpath.evaluate(expression,
inputSrc, XPathConstants.STRING);
setNamespaceContext metodu
Expression içinde namespace kullanmadan sorgu yapabilmemizi sağlar. Şöyle yaparız.
NamespaceContext nsContext = new NamespaceContext() {
@Override
public Iterator getPrefixes(String namespaceURI) {
return null;
}
@Override
public String getPrefix(String namespaceURI) {
return "soap";
}
@Override
public String getNamespaceURI(String prefix) {
return "http://schemas.xmlsoap.org/soap/envelope/";
}
};
xPath.setNamespaceContext(nsContext);
Expression Örnekleri
1. Attribute
@ işareti ile düğümlerin belli attribute'lara sahip olması, olmaması gibi çeşitli seçimler yapılabilir.
1. Bilinen bir attribute değerine göre düğümü bulup başka bir attribute değerini çekmek için ifade şöyle
yazılır.
//Platform[@PlatformNo=47280]/@PlatformTag
XML
şöyledir.
<Platform PlatformTag="2980" PlatformNo="47280" Name="AGHS"
BearingToRoad="2.6606268e+002" RoadName="Avonside Dr">
<Position Lat="-4.352447905000000e+001" Long="1.726611665000000e+002"/>
</Platform>
2. Belli bir attribute değerine sahip düğümü bulmak için şöyle bir ifade
yazılır.
"/message[@from]"
XML
şöyledir.
<message to="-105608156545@chat.facebook.com/Smack"
from="-105465454665906545@chat.facebook.com"
type="chat">
<body>sai</body>
<thread>NNLWF1</thread>
<active xmlns="http://jabber.org/protocol/chatstates" />
</message>
2. Mutlak Yol (/A/B)
Belirtilen mutlak yoldaki düğümleri bulur. Elimizde şöyle bir XML olsun
<message to="-105608156545@chat.facebook.com/Smack"
from="-105465454665906545@chat.facebook.com"
type="chat">
<body>sai</body>
<thread>NNLWF1</thread>
<active xmlns="http://jabber.org/protocol/chatstates" />
</message>
Mutlak yolu kulllanarak bir düğüm şöyle
bulunur. Örnekte XPathExpression.evaluate() metodu kullanılıyor.
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression expression = xPath.compile("/message/body");
node = (Node)expression.evaluate(document,XPathConstants.NODE);
System.out.println("Body: " + node.getTextContent());
Bir başka örneğe bakalım. Elimizde şöyle bir XML
olsun
<test>
<nodeA>
<nodeB>key</nodeB>
<nodeC>value1</nodeC>
</nodeA>
<nodeA>
<nodeB>key</nodeB>
<nodeC>value2</nodeC>
</nodeA>
</test>
Bu XML'den NodeC taglerinin metinlerine erişmek istersek şöyle yaparız. Örnekte XPath.evaluate() metodu kullanılıyor. XPath'te text() testi düğümün metin içerip içermediğini kontrol
eder.
XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "/test/nodeA/nodeC/text()";
InputSource inputSource = new InputSource("sample.xml");
NodeList nodes = (NodeList) xpath.evaluate(expression, inputSource,
XPathConstants.NODESET);
for(int i = 0; i < nodes.getLength(); i++) {
concatenated.append(nodes.item(i).getTextContent());
}
Attribute Seçimi
@ işareti ile düğümlerin belli attribute'lara sahip olması, olmaması gibi çeşitli seçimler yapılabilir.
Elimizde yine aynı XML olsun
<message to="-105608156545@chat.facebook.com/Smack"
from="-105465454665906545@chat.facebook.com"
type="chat">
<body>sai</body>
<thread>NNLWF1</thread>
<active xmlns="http://jabber.org/protocol/chatstates" />
</message>
from attribute alanına sahip message tag'lerini seçmek için aşağıdaki gibi
yaparız.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(new File("Test.xml"));
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression expression = xPath.compile("/message[@from]");
Node node = (Node)expression.evaluate(document, XPathConstants.NODE);
System.out.print(node.getAttributes().getNamedItem("from").getNodeValue());
Daha basit bir örnek
şöyle
XPath xPath = XPathFactory.newInstance().newXPath();
Node node = (Node) xPath.evaluate(
"/HDB/Resident[@Name='Batman ']/Preference", dDoc,
XPathConstants.NODE);