package xesj.app.xpath;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

/**
 * XML adatok beolvasása
 */
public class KonyvXmlReader {

  /**
   * main()
   */
  public static void main(String[] args) throws Exception {
    
    // Beolvasandó XML
    String xml = 
      """
      <?xml version="1.0" encoding="UTF-8"?>
      <konyv xmlns="http://pelda.hu/konyvek" xmlns:kiado="http://pelda.hu/kiado" xmlns:stat="http://pelda.hu/stat">
        <cim>Egri csillagok</cim>
        <szerzo>Gárdonyi Géza</szerzo>
        <kiado:adatok>
          <kiado:nev forras="hvg">Magyar Könyvkiadó</kiado:nev>
          <kiado:ev>2024</kiado:ev>
        </kiado:adatok>
        <kiado:adatok>
          <kiado:nev forras="chatgpt">Alexandra Kiadó</kiado:nev>
          <kiado:ev>1999</kiado:ev>
        </kiado:adatok>
        <stat:adatok>
          <stat:lapszam>234</stat:lapszam>
          <stat:olvasott>101</stat:olvasott>
        </stat:adatok>
        <stat:lapszam>567</stat:lapszam>
      </konyv>
      """;

    // Document létrehozása
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(new InputSource(new StringReader(xml)));

    // XPath létrehozása
    XPath xpath = XPathFactory.newInstance().newXPath();
    xpath.setNamespaceContext(new KonyvNamespaceContext());

    // Könyv címe, szerzője, második kiadója
    System.out.println("Könyv címe: " + xpath.evaluate("/x:konyv/x:cim", document));
    System.out.println("Szerző: " + xpath.evaluate("/x:konyv/x:szerzo", document));
    System.out.println("Ha létezik második kiadó: " + xpath.evaluate("/x:konyv/kiado:adatok[2]/kiado:nev", document));
    
    // Kiadók
    NodeList kiadoNodes = (NodeList)xpath.evaluate("//kiado:adatok", document, XPathConstants.NODESET);
    for (int i = 0; i < kiadoNodes.getLength(); i++) {
      Element kiadoElement = (Element)kiadoNodes.item(i);
      Element kiadoNevElement = (Element)xpath.evaluate("kiado:nev", kiadoElement, XPathConstants.NODE);
      System.out.println((i + 1) + ". Kiadó:");
      System.out.println("   Neve: " + kiadoNevElement.getTextContent());
      System.out.println("   Forrás attribútuma: " + kiadoNevElement.getAttribute("forras"));
      System.out.println("   Kiadás éve: " + xpath.evaluate("kiado:ev", kiadoElement));
    }  
    
    // Bárhol előforduló lapszámok keresése "//"-rel
    NodeList lapszamNodes = (NodeList)xpath.evaluate("//stat:lapszam", document, XPathConstants.NODESET);
    for (int i = 0; i < lapszamNodes.getLength(); i++) {
      Element lapszamElement = (Element)lapszamNodes.item(i);
      System.out.println((i + 1) + ". Lapszám adat: " + lapszamElement.getTextContent());
    }
    
  }

}
