4 Mayıs 2016 Çarşamba

XPath

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);


Hiç yorum yok:

Yorum Gönder