Подтвердить что ты не робот

XML Node для строки в Java

Я наткнулся на эту часть функции Java, чтобы преобразовать XML node в представление 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 node:

<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 node в том, как эта функция действительно хочет.

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

4b9b3361

Ответ 1

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

Например:

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

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

Ответ 2

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


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>

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