Ich stehe auf dem Schlauch. Welche XML API denn nun?

G

Gast2

Gast
Hi Leute,

Sorry für einen weiteren dieser Threads, allerdings stehe ich gerade unter Zeitdruck und trete total auf der Stelle!

Ich habe einige kleine XML Dateien <=500 Zeilen. Diese muss ich einlesen und über die Nodes iterieren können.

Am liebsten wäre mi eine DOM Schnittstelle.

Wo ich nun gar nicht mehr durchblicke welche der APIs ist denn bei den Java Runtimes schon dabei?

Ich möchte nach Möglichkeit keine Extra Bibliothek runterladen müssen (Wie z.B. JDOM).

Das muss doch auch mit Java Bordmitteln gehen?!

Ich bin leicht confused im Moment.
 

mvitz

Top Contributor
Ich wollte nur eben ein Beispiel zusammen zimmern (und dann ist der Perfektionist in mir raus gekommen). Abgesehen davon, hättest du bestimmt mit 5 Minuten googlen ein Beispiel gefunden. Naja, hier ein Beispiel von mir:

Gegeben:
[XML]<?xml version="1.0" encoding="UTF-8" ?>
<root>
<child>
<sub-child name="1" />
<sub-child name="2" />
<sub-child>Text</sub-child>
</child>
</root>[/XML]

Führt folgendes:
Java:
package de.mvitz.examples.xml.dom;

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

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public final class Test {

    public static void main(String[] args) throws Exception {
        final DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        final Document document = builder.parse(Test.class.getResourceAsStream("/test.xml"));

        final Node root = document.getChildNodes().item(0);
        System.out.println(traverse(root));
    }

    private static String traverse(Node node) {
        return traverse(node, 0);
    }

    private static String traverse(Node node, int level) {
        final StringBuilder result = new StringBuilder();
        switch (node.getNodeType()) {
        case Node.ELEMENT_NODE:
            result.append(indent(level)).append(startTag(node));
            result.append(traverseChildren(node, level));
            result.append(indent(level)).append(endTag(node));
            break;
        case Node.TEXT_NODE:
            result.append(text(node, level));
            break;
        default:
            break;
        }
        return result.toString();
    }

    private static String indent(int level) {
        final StringBuilder indent = new StringBuilder();
        for (int i = 0; i < level; i++)
            indent.append("  ");
        return indent.toString();
    }

    private static String startTag(Node node) {
        return "<" + node.getNodeName() + attributes(node) + ">\n";
    }

    private static String attributes(Node node) {
        final StringBuilder result = new StringBuilder();
        final NamedNodeMap attributes = node.getAttributes();
        for (int i = 0; i < attributes.getLength(); i++) {
            result.append(attribute(attributes.item(i)));
        }
        return result.toString();
    }

    private static String attribute(Node attribute) {
        return " " + attribute.getNodeName() + "=\"" + attribute.getNodeValue() + "\"";
    }

    private static String traverseChildren(Node node, int level) {
        final StringBuilder result = new StringBuilder();
        final NodeList children = node.getChildNodes();
        for (int i = 0; i < children.getLength(); i++) {
            result.append(traverse(children.item(i), level + 1));
        }
        return result.toString();
    }

    private static String endTag(Node node) {
        return "</" + node.getNodeName() + ">\n";
    }

    private static String text(Node node, int level) {
        if (!"".equals(node.getNodeValue().trim()))
            return indent(level) + node.getNodeValue() + "\n";
        return "";
    }

}

zu:
Code:
<root>
  <child>
    <sub-child name="1">
    </sub-child>
    <sub-child name="2">
    </sub-child>
    <sub-child>
      Text
    </sub-child>
  </child>
</root>

Hoffe es hilft.
 

mvitz

Top Contributor
Sorry für Doppelpost aber, irgendwie ist die JDom API schöner (ok, unfairer Vergleich, da org.wc3.dom schon vor Einführung des Collection Frameworks existiert hat).

Dasselbe mit JDom:
Java:
package de.mvitz.examples.xml.jdom;

import java.util.List;

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

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.DOMBuilder;

public final class Test {

    public static void main(String[] args) throws Exception {
        final DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document document = new DOMBuilder().build(docBuilder.parse(Test.class.getResourceAsStream("/test.xml")));

        final Element root = document.getRootElement();
        System.out.println(traverse(root));
    }

    private static String traverse(Element element) {
        return traverse(element, 0);
    }

    private static String traverse(Element element, int level) {
        return new StringBuilder()
            .append(indent(level)).append(startTag(element))
                .append(traverseChildren(element, level))
            .append(indent(level)).append(endTag(element))
        .toString();
    }

    private static String indent(int level) {
        final StringBuilder indent = new StringBuilder();
        for (int i = 0; i < level; i++)
            indent.append("  ");
        return indent.toString();
    }

    private static String startTag(Element element) {
        return "<" + element.getName() + attributes(element) + ">\n";
    }

    @SuppressWarnings("unchecked")
    private static String attributes(Element element) {
        final StringBuilder result = new StringBuilder();
        for (Attribute attribute : (List<Attribute>) element.getAttributes())
            result.append(attribute(attribute));
        return result.toString();
    }

    private static String attribute(Attribute attribute) {
        return " " + attribute.getName() + "=\"" + attribute.getValue() + "\"";
    }

    @SuppressWarnings("unchecked")
    private static String traverseChildren(Element element, int level) {
        final List<Element> children = (List<Element>) element.getChildren();
        if (children.isEmpty())
            return text(element, level + 1);
        else {
            final StringBuilder result = new StringBuilder();
            for (Element child : children)
                result.append(traverse(child, level + 1));
            return result.toString();
        }
    }

    private static String endTag(Element element) {
        return "</" + element.getName() + ">\n";
    }

    private static String text(Element element, int level) {
        return "".equals(element.getTextTrim()) ? "" : indent(level) + element.getTextNormalize() + "\n";
    }

}
 

Ähnliche Java Themen

Neue Themen


Oben