Узел XML в строку в Java - PullRequest
       18

Узел XML в строку в Java

31 голосов
/ 10 декабря 2010

Я натолкнулся на этот фрагмент функции Java для преобразования узла XML в представление Java String:

private 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();
}

Это выглядит просто, так как она хочет, чтобы у выходной строки не было никакого объявления XML, и она должна содержать отступ.

Но мне интересно, каким должен быть фактический вывод, предположим, у меня есть узел XML:

<p><media type="audio" id="au008093" rights="wbowned">
<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>

Могу ли я предположить, что результирующая строка после применения вышеуказанного преобразования:

"media type="audio" id="au008093" rights="wbowned" title Bee buzz title /media"

Я хочу протестировать его сам, но я не знаю, как представить этот узел XML так, как этого хочет эта функция.

Я немного растерялся и заранее благодарен за щедрую помощь.

Ответы [ 2 ]

37 голосов
/ 11 декабря 2010

Все важное уже сказано. Я попытался скомпилировать следующий код.


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();
  }

}

И он выдал следующий вывод:


<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>

Вы можете дополнительно настроить его самостоятельно. Удачи!

15 голосов
/ 11 декабря 2010

У вас есть представление XML в дереве DOM.
Например, вы открыли файл XML и передали его в анализатор DOM.
В результате создается дерево DOM в памяти с вашим XML.
Теперь вы можете получить доступ к информации XML только через обход дерева DOM.
Однако, если вам нужно, в строковом представлении информации XML дерева DOM вы используете преобразование.
Это происходит, посколькуневозможно получить представление String непосредственно из дерева DOM.
Так что, если, например, Node node вы передаете nodeToString, это корневой элемент документа XML, то результатом будет строка, содержащая исходные данные XML..
Теги все еще будут там.Т.е. у вас будет действительное представление XML.Только это время будет в строковой переменной.

Например:

  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);

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Даже не пытался скомпилировать код.Надеюсь, вы понимаете, что вы должны сделать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...