จริงๆแล้ว Java รองรับ 4 วิธีในการแยกวิเคราะห์ XML ออกจากกล่อง:
DOM Parser / Builder: โครงสร้าง XML ทั้งหมดถูกโหลดเข้าสู่หน่วยความจำและคุณสามารถใช้วิธี DOM ที่รู้จักกันดีในการทำงานกับมัน DOM ยังช่วยให้คุณสามารถเขียนเอกสารด้วยการแปลง Xslt ตัวอย่าง:
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 Parser: อ่านเอกสาร XML อย่างเดียว เครื่องมือแยกวิเคราะห์ Sax ทำงานผ่านเอกสารและเรียกวิธีการโทรกลับของผู้ใช้ มีวิธีการเริ่ม / สิ้นสุดของเอกสารองค์ประกอบและอื่น ๆ พวกเขากำลังกำหนดใน org.xml.sax.ContentHandler และมีคลาสตัวช่วยว่างเปล่า DefaultHandler
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 Reader / Writer: ใช้งานได้กับส่วนต่อประสานดาต้าสตรีม โปรแกรมจะถามองค์ประกอบถัดไปเมื่อพร้อมเช่นเคอร์เซอร์ / ตัววนซ้ำ คุณยังสามารถสร้างเอกสารด้วย อ่านเอกสาร:
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
}
}
}
เขียนเอกสาร:
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: เป็นส่วนหนึ่งของ Java 6 ใน v2 สิ่งนี้ทำให้เราสามารถทำให้วัตถุ java เป็นอนุกรมจากเอกสาร คุณอ่านเอกสารที่มีคลาสที่ใช้อินเตอร์เฟสกับ javax.xml.bind.Unmarshaller (คุณจะได้รับคลาสสำหรับสิ่งนี้จาก JAXBContext.newInstance) บริบทจะต้องเริ่มต้นด้วยคลาสที่ใช้ แต่คุณต้องระบุคลาสรูทและไม่ต้องกังวลเกี่ยวกับคลาสอ้างอิงแบบคงที่ คุณใช้คำอธิบายประกอบเพื่อระบุว่าคลาสใดควรเป็นองค์ประกอบ (@XmlRootElement) และฟิลด์ใดเป็นองค์ประกอบ (@XmlElement) หรือแอตทริบิวต์ (@XmlAttribute น่าประหลาดใจมาก!)
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);
}
}
เขียนเอกสาร:
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);
}
}
ตัวอย่างที่คัดลอกมาจากสไลด์เลคเชอร์เก่า ๆ ;-)
แก้ไข: เกี่ยวกับ "ฉันควรใช้ API แบบใด" มันขึ้นอยู่กับว่าไม่ใช่ API ทุกตัวที่มีความสามารถเหมือนที่คุณเห็น แต่ถ้าคุณสามารถควบคุมคลาสที่คุณใช้ในการแมปเอกสาร XML JAXB นั้นเป็นที่ชื่นชอบส่วนตัวโซลูชันที่เรียบง่ายและสง่างามจริงๆ (แม้ว่าฉันไม่ได้ใช้ เอกสารที่มีขนาดใหญ่มากมันอาจซับซ้อนเล็กน้อย) SAX นั้นค่อนข้างใช้งานง่ายและอยู่ห่างจาก DOM ถ้าคุณไม่มีเหตุผลที่ดีที่จะใช้ API เก่า ๆ ที่เป็น clunky ในความคิดของฉัน ฉันไม่คิดว่าจะมีห้องสมุดบุคคลที่ 3 ที่ทันสมัยซึ่งมีประโยชน์อย่างยิ่งโดยเฉพาะที่ขาดหายไปจาก STL และห้องสมุดมาตรฐานมีข้อได้เปรียบตามปกติในการทดสอบเอกสารและมีเสถียรภาพ