XPath Sınıfı
Şu satırı dahil ederiz.
XPathFactory ile yaratılır. Şöyle yaparız.
Sonra çalıştırılmak üzer bir XPathExpression nesnesi döner. Şöyle yaparız.
Şöyle yaparız.
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.
Expression içinde namespace kullanmadan sorgu yapabilmemizi sağlar. Şöyle yaparız.
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.
2. Belli bir attribute değerine sahip düğümü bulmak için şöyle bir ifade yazılır.
2. Mutlak Yol (/A/B)
Belirtilen mutlak yoldaki düğümleri bulur. Elimizde şöyle bir XML olsun
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.
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
Şu satırı dahil ederiz.
import javax.xml.xpath.*;
constructorXPathFactory ile yaratılır. Şöyle yaparız.
XPath xpath = XPathFactory.newInstance().newXPath();
compile metoduSonra ç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 - InputSourceInputSource 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 metoduExpression 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 Örnekleri1. 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>
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 şöyleXPath xPath = XPathFactory.newInstance().newXPath();
Node node = (Node) xPath.evaluate(
"/HDB/Resident[@Name='Batman ']/Preference", dDoc,
XPathConstants.NODE);
Hiç yorum yok:
Yorum Gönder