XML Node to String in Java

前端 未结 2 959
栀梦
栀梦 2020-11-30 11:13

I came across this piece of Java function to convert an XML node to a Java String representation:

private String nodeToString(Node node) {
StringWriter sw =          


        
相关标签:
2条回答
  • 2020-11-30 11:22

    All important has already been said. I tried to compile the following code.

    
    import java.io.ByteArrayInputStream;
    import java.io.InputStream;
    import java.io.StringWriter;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    
    public class Test {
    
      public static void main(String[] args) throws Exception {
    
        String s = 
          "<p>" +
          "  <media type=\"audio\" id=\"au008093\" rights=\"wbowned\">" +
          "    <title>Bee buzz</title>" +
          "  " +
          "  Most other kinds of bees live alone instead of in a colony." +
          "  These bees make tunnels in wood or in the ground." +
          "  The queen makes her own nest." +
          "</p>";
        InputStream is = new ByteArrayInputStream(s.getBytes());
    
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document d = db.parse(is);
    
        Node rootElement = d.getDocumentElement();
        System.out.println(nodeToString(rootElement));
    
      }
    
      private static String nodeToString(Node node) {
        StringWriter sw = new StringWriter();
        try {
          Transformer t = TransformerFactory.newInstance().newTransformer();
          t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
          t.setOutputProperty(OutputKeys.INDENT, "yes");
          t.transform(new DOMSource(node), new StreamResult(sw));
        } catch (TransformerException te) {
          System.out.println("nodeToString Transformer Exception");
        }
        return sw.toString();
      }
    
    }
    
    

    And it produced the following output:

    
    <p>  <media id="au008093" rights="wbowned" type="audio">    <title>Bee buzz</title>  </media>  Most other kinds of bees live alone instead of in a colony.  These bees make tunnels in wood or in the ground.  The queen makes her own nest.</p>
    
    

    You can further tweak it by yourself. Good luck!

    0 讨论(0)
  • 2020-11-30 11:39

    You have an XML respesentation in a DOM tree.
    For example you have opened an XML file and you have passed it in the DOM parser.
    As a result a DOM tree in memory with your XML is created.
    Now you can only access the XML info via traversal of the DOM tree.
    If you need though, a String representation of the XML info of the DOM tree you use a transformation.
    This happens since it is not possible to get the String representation directly from a DOM tree.
    So if for example as Node node you pass in nodeToString is the root element of the XML doc then the result is a String containing the original XML data.
    The tags will still be there. I.e. you will have a valid XML representation. Only this time will be in a String variable.

    For example:

      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder parser = factory.newDocumentBuilder();
      Document xmlDoc = parser.parse(file);//file has the xml
      String xml = nodeToString(xmlDoc.getDocumentElement());//pass in the root
      //xml has the xml info. E.g no xml declaration. Add it
      xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?> + xml;//bad to append this way...
      System.out.println("XML is:"+xml);
    

    DISCLAIMER: Did not even attempt to compile code. Hopefully you understand what you have to do

    0 讨论(0)
提交回复
热议问题