Aslında Java, XML'i kutudan ayırmak için 4 yöntemi destekler:
DOM Ayrıştırıcı / Oluşturucu: Tüm XML yapısı belleğe yüklenir ve onunla çalışmak için iyi bilinen DOM yöntemlerini kullanabilirsiniz. DOM ayrıca Xslt dönüşümleriyle belgeye yazmanıza da olanak tanır. Misal:
public static void parse() throws ParserConfigurationException, IOException, SAXException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder = factory.newDocumentBuilder();
File file = new File("test.xml");
Document doc = builder.parse(file);
// Do something with the document here.
}
SAX Ayrıştırıcı: Yalnızca bir XML belgesi okumak için. Sax ayrıştırıcı belge üzerinden çalışır ve kullanıcının geri arama yöntemlerini çağırır. Bir belgenin, öğenin başlangıcı / bitişi için yöntemler vardır. Bunlar org.xml.sax.ContentHandler içinde tanımlanır ve boş bir DefaultHandler yardımcı sınıfı vardır.
public static void parse() throws ParserConfigurationException, SAXException {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
SAXParser saxParser = factory.newSAXParser();
File file = new File("test.xml");
saxParser.parse(file, new ElementHandler()); // specify handler
}
StAx Okuyucu / Yazıcı: Bu veri akışı odaklı bir arayüzle çalışır. Program, bir imleç / yineleyici gibi hazır olduğunda bir sonraki öğeyi ister. Bununla birlikte belgeler de oluşturabilirsiniz. Belgeyi okuyun:
public static void parse() throws XMLStreamException, IOException {
try (FileInputStream fis = new FileInputStream("test.xml")) {
XMLInputFactory xmlInFact = XMLInputFactory.newInstance();
XMLStreamReader reader = xmlInFact.createXMLStreamReader(fis);
while(reader.hasNext()) {
reader.next(); // do something here
}
}
}
Belge yaz:
public static void parse() throws XMLStreamException, IOException {
try (FileOutputStream fos = new FileOutputStream("test.xml")){
XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
XMLStreamWriter writer = xmlOutFact.createXMLStreamWriter(fos);
writer.writeStartDocument();
writer.writeStartElement("test");
// write stuff
writer.writeEndElement();
}
}
JAXB: XML belgelerini okumak için en yeni uygulama: v2'deki Java 6'nın bir parçasıdır. Bu, bir belgeden java nesnelerini serileştirmemize izin verir. Belgeyi javax.xml.bind.Unmarshaller için bir arabirim uygulayan bir sınıfla okursunuz (bunun için bir sınıf JAXBContext.newInstance adresinden alırsınız). Bağlamın kullanılan sınıflarla başlatılması gerekir, ancak yalnızca kök sınıflarını belirtmeniz gerekir ve statik başvurulan sınıflar hakkında endişelenmeniz gerekmez. Hangi sınıfların öğe (@XmlRootElement) olması ve hangi alanların öğe (@XmlElement) veya nitelikler (@XmlAttribute, ne sürpriz!) Olacağını belirtmek için ek açıklamalar kullanırsınız.
public static void parse() throws JAXBException, IOException {
try (FileInputStream adrFile = new FileInputStream("test")) {
JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
Unmarshaller um = ctx.createUnmarshaller();
RootElementClass rootElement = (RootElementClass) um.unmarshal(adrFile);
}
}
Belge yaz:
public static void parse(RootElementClass out) throws IOException, JAXBException {
try (FileOutputStream adrFile = new FileOutputStream("test.xml")) {
JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
Marshaller ma = ctx.createMarshaller();
ma.marshal(out, adrFile);
}
}
Bazı eski ders slaytlarından utanmadan kopyalanan örnekler ;-)
Düzenleme: Hakkında "hangi API'yi kullanmalıyım?". Şey bağlıdır - tüm API'ler gördüğünüz gibi aynı yeteneklere sahip değildir, ancak XML belgesini eşlemek için kullandığınız sınıflar üzerinde kontrolünüz varsa JAXB benim kişisel favori, gerçekten zarif ve basit bir çözümdür ( Gerçekten büyük belgeler, biraz karmaşık olabilir). SAX'ın kullanımı oldukça kolaydır ve kullanmak için gerçekten iyi bir nedeniniz yoksa DOM'dan uzak durun - bence eski, hantal API. STL'de eksik olan özellikle kullanışlı bir şey içeren herhangi bir modern üçüncü taraf kütüphanesi olduğunu düşünmüyorum ve standart kütüphaneler son derece iyi test edilmiş, belgelenmiş ve kararlı olmanın olağan avantajlarına sahip.