Announcement

Collapse
No announcement yet.

XML DOM Teilbaum ausgeben?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XML DOM Teilbaum ausgeben?

    Hallo,

    ich habe aus einem XML Dokument per XPath einen DOM Node erhalten und
    möchte diesen Knoten (als Teilbaum) wieder in ein Stringformat bringen.

    Leider geht das nicht unter Benutzung des Transformers. Wenn ich diesem
    den Knoten als new DOMSource(node) übergebe, gibt der Transformer das
    gesamte Originaldokument aus und nicht nur den Teil. Den Knoten kopieren und in ein neu
    erzeugtes Dokument einbauen führt zu einer DOMException (WRONG_DOCUMENT_ERROR).

    Das muss doch irgendwie gehen, ohne gleich XSLT zu nutzen oder einen
    eigenen Transformer zu schreiben?!

    Hat jemand eine Idee?

    LG
    Holger

  • #2
    [highlight=java]

    TransformerFactory transFactory = TransformerFactory.newInstance();
    Transformer transformer = transFactory.newTransformer();
    StringWriter buffer = new StringWriter();
    transformer.setOutputProperty(OutputKeys.OMIT_XML_ DECLARATION, "yes");
    transformer.transform(new DOMSource(node),
    new StreamResult(buffer));
    String str = buffer.toString();
    [/highlight]
    Zuletzt editiert von Christian Marquardt; 02.03.2012, 11:08.
    Christian

    Comment


    • #3
      Das habe ich ja versucht, aber das gibt nicht den Teilbaum unter node
      aus, sondern das gesamte Dokument (von dem der node nur Teilbaum ist).

      Comment


      • #4
        Kann ich so nicht nachvollziehen:

        Mit der XML-Datei

        <?xml version="1.0"?>
        <Employee>
        <Emp_Id> E-002 </Emp_Id>
        <Emp_Name> Amit </Emp_Name>
        <Emp_E-mail> [email protected] </Emp_E-mail>
        </Employee>
        ergibt folgender Code

        [highlight=java]
        public static void main(String[] args) throws ParseException, SAXException, IOException,
        ParserConfigurationException, TransformerException {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(new File("test.xml"));
        NodeList nl = doc.getElementsByTagName("Emp_Name");
        Node node = nl.item(0);

        TransformerFactory transFactory = TransformerFactory.newInstance();
        Transformer transformer = transFactory.newTransformer();
        StringWriter buffer = new StringWriter();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_ DECLARATION, "yes");
        transformer.transform(new DOMSource(node), new StreamResult(buffer));
        String str = buffer.toString();
        System.out.println(str);
        }

        [/highlight]

        Die gewünschte Ausgabe des Knotens

        <Emp_Name> Amit </Emp_Name>
        Christian

        Comment


        • #5
          Das ist ja mal wieder typisch. Da versuche ich, einen Testcase zusammenzubauen,
          und nun klappt es auch bei mir, wie es soll.

          Ich muss irgendwas beim Bauen des Nodes falsch gemacht haben.

          Ich sag schonmal danke! (und wenn ich rausfinde, was da falschgelaufen ist, gits noch einen Post)

          LG
          Holger

          Comment


          • #6
            Fehler gefunden!
            Das Extrahieren klappt nicht, sobald ich den Saxon (version 6 vom epubcheck Projekt) im classpath habe.
            Und nebenbei bemerkt: Saxon 9 kracht wegen anderer Sachen.

            Comment


            • #7
              Hmmm, nutze doch den Standardparser im JDK/JRE. s.o.
              Christian

              Comment


              • #8
                Klaro, mache ich jetzt auch.

                Dummerweise kann ich den saxon nicht aus meinem classpath nehmen, weil ich den für andere Projekte brauche.
                Ich erzeuge jetzt die TransformerFactoryImpl direkt, was aber nur geht, weil ich eine andere Version von Xerces ebenfalls in meinen Classpath habe. (ja mein Classapth ist zu lang :-)

                (Nur so Interesse halber: ) Kann man die Implementierung aus der Runtime eigentlich auch direkt anfordern? Eclipse sagt zu:
                Code:
                TransformerFactory tf = new com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl();
                leider
                Code:
                Access restriction: The constructor TransformerFactoryImpl() is not accessible due to restriction on required library /opt/jdk1.6.0_31/jre/lib/rt.jar
                ... Manchmal frage ich mich, ob das Factory Pattern nicht eher ein Antipattern ist :-)
                Zuletzt editiert von Holger Klawitter; 02.03.2012, 12:52. Reason: add: Will das mit der DefaultImpl nur interessehalber wissen. :)

                Comment


                • #9
                  Mit Ecplise 3.6 und Java 1.5 funktioniert obige Zeile. Eine 1.6er habe ich hier nicht.

                  Allerdings würd ich nun keine Sinn erkennen, das direkt anzufordern
                  Christian

                  Comment

                  Working...
                  X