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 в том, как эта функция действительно хочет.
Я немного смущен и заранее благодарен за щедрую помощь.
Ответы
Ответ 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>
Вы можете дополнительно настроить его самостоятельно. Удачи!