Javaを使用して、次の形式のドキュメントを取得します。
<tag1>
<tag2>
<![CDATA[ Some data ]]>
</tag2>
</tag1>
そしてそれを次のように変換します:
<tag1><tag2><![CDATA[ Some data ]]></tag2></tag1>
以下を試しましたが、期待した結果が得られません。
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
dbfac.setIgnoringElementContentWhitespace(true);
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document doc = docBuilder.parse(new FileInputStream("/tmp/test.xml"));
Writer out = new StringWriter();
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "no");
tf.transform(new DOMSource(doc), new StreamResult(out));
System.out.println(out.toString());
@Luiggi Mendozaによる質問のコメントの指示に従った実用的なソリューション。
public static String trim(String input) {
BufferedReader reader = new BufferedReader(new StringReader(input));
StringBuffer result = new StringBuffer();
try {
String line;
while ( (line = reader.readLine() ) != null)
result.append(line.trim());
return result.toString();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
別の質問への回答 に記載されているように、関連する関数は DocumentBuilderFactory.setIgnoringElementContentWhitespace() ですが、ここですでに指摘したように、この関数では検証を使用する必要がありますXMLスキーマなどを必要とするパーサー。
したがって、最善の策は、パーサーから取得したドキュメントを反復処理し、タイプTEXT_NODE(または空白のみを含むTEXT_NODE)のすべてのノードを削除することです。
ドキュメントを再帰的にトラバースします。内容が空白のテキストノードを削除します。空白でないコンテンツを持つテキストノードをトリミングします。
public static void trimWhitespace(Node node)
{
NodeList children = node.getChildNodes();
for(int i = 0; i < children.getLength(); ++i) {
Node child = children.item(i);
if(child.getNodeType() == Node.TEXT_NODE) {
child.setTextContent(child.getTextContent().trim());
}
trimWhitespace(child);
}
}
Java8 + transformerは何も作成しませんが、Java10 + transformerはどこにでも空の行を挿入します。私はまだかなりのインデントを維持したいと思います。これは、doc.getDocumentElement()
ルートノードなどのDOMElementインスタンスからxml文字列を作成するためのヘルパー関数です。
public static String createXML(Element elem) throws Exception {
DOMSource source = new DOMSource(elem);
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
//transformer.setOutputProperty("{http://xml.Apache.org/xslt}indent-amount", "2");
//transformer.setOutputProperty("http://www.Oracle.com/xml/is-standalone", "yes");
transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,"yes");
transformer.setOutputProperty("http://www.Oracle.com/xml/is-standalone", "yes");
transformer.transform(source, result);
// Java10-transformer adds unecessary empty lines, remove empty lines
BufferedReader reader = new BufferedReader(new StringReader(writer.toString()));
StringBuilder buf = new StringBuilder();
try {
final String NL = System.getProperty("line.separator", "\r\n");
String line;
while( (line=reader.readLine())!=null ) {
if (!line.trim().isEmpty()) {
buf.append(line);
buf.append(NL);
}
}
} finally {
reader.close();
}
return buf.toString(); //writer.toString();
}