Archive Page 2



Az XML gyökér elem megszerzése

A fejezet elolvasása után képesek leszünk visszanyerni az XML dokumentum gyökér elemét. A JAXP (Java API for XML Processing) egységes interfészt biztosít a szabványos SAX (Simple API for XML), DOM és XSLT-ket (Extensible Stylesheet Language Transformations) tartalmazó XML fájlok készítéséhez és használatukhoz. A bemutatott példán keresztül látni fogjuk a DOM interfész használatát.

A program leírása:

Készíts egy XML fájlt. A Java és az XML fájl ugyanabban a könyvtárban legyen. A program jelenítse meg az XML fájlt a képernyőn. Ha a fájl létezik akkor végezze el a szűrést (parse) a parse() metódus használatával. Az XML dokumentum feldolgozása előtt szükséged lesz egy DocumentBuilder objektumra. Ennek a létrehozásához először egy DocumentBuilderFactory-t kell készítened. Az XML dokumentum feldolgozása után a csomópont elemet (node element) a getDocumentElement() metódussal kapod meg. A gyökér megkereséséhez a getNodeName() metódust használd.

A minta XML fájl, Employee-Detail.xml:

<?xml version = "1.0" ?>
<Employee-Detail>

    <Employee>
        <Emp_Id>E-001</Emp_Id>
        <Emp_Name>Vinod</Emp_Name>
        <Emp_E-mail>Vinod1@yahoo.com</Emp_E-mail>
    </Employee>

    <Employee>
        <Emp_Id>E-002</Emp_Id>
        <Emp_Name>Amit</Emp_Name>
        <Emp_E-mail>Amit2@yahoo.com</Emp_E-mail>
    </Employee>

    <Employee>
        <Emp_Id>E-003</Emp_Id>
        <Emp_Name>Deepak</Emp_Name>
        <Emp_E-mail>Deepak3@yahoo.com</Emp_E-mail>
    </Employee>

</Employee-Detail>

A program, GetRootNode.java:

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;

public class GetRootNode{

    public static void main(String[] args) {

        try{

            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("Enter xml file name: ");
            String str = bf.readLine();
            File file = new File(str);

            if (file.exists()) {

                DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = fact.newDocumentBuilder();
                Document doc = builder.parse(str);
                Node node = doc.getDocumentElement();
                String root = node.getNodeName();
                System.out.println("Root Node: " + root);
            }

            else {

                System.out.println("File not found!");
            }
        }

        catch(Exception e) {}
    }
}

A következő fejezetben az XML elemek megszámolását fogjuk megpróbálni.

DOM gyermek elem (child element) létrehozása

Ebben a fejezetben a gyökér és gyermek elem létrehozásáról lesz szó a DOM fában (DOM tree). Először egy üres DOM dokumentumot készítünk, és hozzáadjuk a gyökér elemet. Utána megjegyzés majd gyermek elemet fogunk a gyökér elemhez adni. A lecke során a következő XML kódot fogjuk elkészíteni és megjeleníteni a konzolon.

<?xml version="1.0" encoding="UTF-8" ?>
<root>
<!-- This is comment-->
<Child attribute1="The value of Attribute 1" />
</root>

A gyökér elem létrehozása:

Az előző leckében megtanultuk hogyan készítsük el a DocumentBuilder objektumot és hozzuk létre az üres DOM dokumentumot. A következő kódrészlet elkészíti az üres dokumentumot.

//Create blank DOM Document
Document doc = docBuilder.newDocument();

A createElement funkciót használhatjuk a gyökér elem létrehozására, majd az appendChild metódussal fűzhetjük hozzá a létrehozott elemet a DOM dokumentumhoz.

//create the root element
Element root = doc.createElement("root");

//all it to the xml tree
doc.appendChild(root);

Megjegyzés elem hozzáadása a DOM fához:

A doc.createComment funkcióval készíthetünk megjegyzés objektumot.

//create a comment
Comment comment = doc.createComment("This is comment");

//add in the root element
root.appendChild(comment);

Gyerkmek elem hozzáadása a DOM fához:

A doc.createElement funkcióval készíthetünk gyermek elemet.

//create child element
Element childElement = doc.createElement("Child");

//Add the atribute to the child
childElement.setAttribute("attribute1","The value of Attribute 1");
root.appendChild(childElement);

A DOM fa megjelenítése a konzolon a következő kódrészlettel lehetséges:

TransformerFactory tranFactory = TransformerFactory.newInstance();
Transformer aTransformer = tranFactory.newTransformer();

Source src = new DOMSource(doc);
Result dest = new StreamResult(System.out);
aTransformer.transform(src, dest);

Minta, CreateDomXml.java:

import org.w3c.dom.*;

import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

class CreateDomXml {

    public static void main(String[] args) {

        try{

            //Create instance of DocumentBuilderFactory
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

            //Get the DocumentBuilder
            DocumentBuilder docBuilder = factory.newDocumentBuilder();

            //Create blank DOM Document
            Document doc = docBuilder.newDocument();

            //create the root element
            Element root = doc.createElement("root");

            //add it to the xml tree
            doc.appendChild(root);

            //create a comment
            Comment comment = doc.createComment("This is comment");

            //add in the root element
            root.appendChild(comment);

            //create child element
            Element childElement = doc.createElement("Child");

            //Add the atribute to the child
            childElement.setAttribute("attribute1","The value of Attribute 1");
            root.appendChild(childElement);

            TransformerFactory tranFactory = TransformerFactory.newInstance();
            Transformer aTransformer = tranFactory.newTransformer();

            Source src = new DOMSource(doc);
            Result dest = new StreamResult(System.out);
            aTransformer.transform(src, dest);
        }

        catch(Exception e) {

            System.out.println(e.getMessage());
        }
    }
}

A következő fejezetben az XML gyökér objektum megszerzéséről lesz szó.

Üres DOM dokumentum létrehozása

Ebben a fejezetben bemutatom, hogyan lehet üres DOM dokumentumot létrehozni. A JAXP (Java API for XML Processing) egy Java interfész, ami az XML dokumentumok elemzésének egy szabványos megközelítése. A JAXP-al a DocumentBuilderFactory-t fogjuk használni a DocumentBuilder osztály létrehozásához.

A DocumentBuilderFactory osztály felelős az új DOM elemzők (parsers) létrehozásáért. Általában ezt használják DOM elemzőként.

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();

//The parse function is used to parse existing xml document.
Document doc = parser.parse(myInputSource);

A DocumentBuilderFactory a javax.xml.parsers.XmlDocumentParserFactory nevű rendszerváltozót használja, hogy megtalálja a betöltendő osztályt. Így az elemzőt bármikor megváltoztathatjuk:

System.setProperty("javax.xml.parsers.XmlDocumentParserFactory", "com.foo.myFactory");

A DocumentBuilder osztály példánya való üres dokumentum készítésére. Az osztály newDocument() metódusa egy üres DOM dokumentummal tér vissza.

Document doc = parser.newDocument();

Minta, CreateBlankDocument.java:

import org.w3c.dom.*;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

public class CreateBlankDocument {

    public static void main(String[] args) {

        System.out.println("Creating Balnk Document...");

        try{

            //Create instance of DocumentBuilderFactory
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

            //Get the DocumentBuilder
            DocumentBuilder parser = factory.newDocumentBuilder();

            //Create blank DOM Document
            Document doc = parser.newDocument();
        }

        catch(Exception e) {

            System.out.println(e.getMessage());
        }

        System.out.println("Done...");
        System.out.println("Exiting...");
    }
}

A következő fejezetben a gyökér- és gyermek elemekkel fogunk foglalkozni.

Dátum manipulációs trükkök

Tegnap egy olyan programot kellett készítenem, amiben mindenféle időpontokkal kellett műveleteket végeznem, pl. a holnapi dátumra volt szükségem, vagy a hónap első napjára, és mind ezt Java-ban. A következő kódrészleteket a Google-val találtam, és mivel nagyon hasznos volt számomra, úgy döntöttem, hogy a blogomat újra nyitom, és megtöltöm hasznos kódrészletekkel ;-).

Dátum formázása:

SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
Date newDate = new Date();
String newdate = dateformat.format(newDate);
System.out.println(newdate);

Napok hozzáadása a dátumhoz:

SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);    //Adding 1 day to current date
String newdate = dateformat.format(cal.getTime());
System.out.println(newdate);

Hónapok hozzáadása a dátumhoz:

SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);    //Adding 1 month to current date
String newdate = dateformat.format(cal.getTime());
System.out.println(newdate);

Évek hozzáadása a dátumhoz:

SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, 1);    //Adding 1 year to current date
String newdate = dateformat.format(cal.getTime());
System.out.println(newdate);

Évek kivonása a dátumból:

SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, -1);    //-1 for subtracting
String newdate = dateformat.format(cal.getTime());
System.out.println(newdate);

Hónapok kivonása a dátumból:

SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, -1);    //-1 for subtracting
String newdate = dateformat.format(cal.getTime());
System.out.println(newdate);

Napok kivonása a dátumból:

SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);    //-1 for subtracting
String newdate = dateformat.format(cal.getTime());
System.out.println(newdate);

Órák hozzáadása a dátumhoz:

SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.HOUR, 1);    //Adding 1 hour to current date time
String newdate = dateformat.format(cal.getTime());
System.out.println(newdate);

Percek hozzáadása a dátumhoz:

SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MINUTE, 10);    //Adding 10 minute to current date time
String newdate = dateformat.format(cal.getTime());
System.out.println(newdate);

Másodpercek hozzáadása a dátumhoz:

SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 40);    //Adding 40 minute to current date time
String newdate = dateformat.format(cal.getTime());
System.out.println(newdate);

Órák kivonása a dátumból:

SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.HOUR, -1);    //Subtracting 1 hour to current date time
String newdate = dateformat.format(cal.getTime());
System.out.println(newdate);

Percek kivonása a dátumból:

SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MINUTE, -10);    //Subtracting 10 minute to current date time
String newdate = dateformat.format(cal.getTime());
System.out.println(newdate);

Másodpercek kivonása a dátumból:

SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, -40);    //Subtracting 40 minute to current date time
String newdate = dateformat.format(cal.getTime());
System.out.println(newdate);

Forrás: http://www.hiteshagrawal.com/java/date-manipulation-in-java

Biztonsági probléma a Sun JRE-ben

A Sun Microsystems arra figyelmeztet, hogy biztonsági sebezhetőség található a Sun Java Runtime Environment-ben (JRE). A bug az unpack200 névre hallgató JAR Upacking Tool-t érinti. A rosszindulatú támadó speciálisan összeállított Java archive segítségével a hibát kihasználva tetszőleges kódot injektálhat illetve hajthat végre a felhasználó számítógépén, annak jogosultságaival. Bizonyos esetekben a hiba kihasználására akár egy speciálisan preparált weboldal meglátogatásakor is sor kerülhet.

A bug a Java JDK és JRE 5 Update 17 és korábbi, illetve a 6 update 12 és korábbi verziókban található. Mind a Windows, mind a Linux, mind a Solaris verziók érintettek. A Sun megjegyezte, hogy az 1.4.2-es és 1.3.1-es verziók nem érintettek.

A felhasználók a parancssort használva megállapíthatják, hogy milyen Java verziót futtatnak. Ehhez a “java -version” parancsot kell végrehajtani. Firefox böngészőkben az “about:plugins” lap is információkkal szolgálhat. Ezen kívül megállapítható a telepített Java verziója a “Verify Java Version” weboldal meglátogatásával.

A problémás verziót futtatóknak érdemes mielőbb frissíteni a Java 5 Update 18-ra vagy a Java 6 Update 13-ra.

A részletek itt olvashatók.

Forrás: Hungarian Unix Portal