フォーマット済みのXMLファイルがあり、それを1行の文字列に変換したいのですが、どうすればよいですか。
サンプルxml:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<title>Basic XML</title>
<price>100</price>
<qty>5</qty>
</book>
<book>
<title>Basic Java</title>
<price>200</price>
<qty>15</qty>
</book>
</books>
期待される出力
<?xml version="1.0" encoding="UTF-8"?><books><book> <title>Basic XML</title><price>100</price><qty>5</qty></book><book><title>Basic Java</title><price>200</price><qty>15</qty></book></books>
前もって感謝します。
//filename is filepath string
BufferedReader br = new BufferedReader(new FileReader(new File(filename)));
String line;
StringBuilder sb = new StringBuilder();
while((line=br.readLine())!= null){
sb.append(line.trim());
}
stringBuilderを使用すると、連結よりも効率的です http://kaioa.com/node/59
XSLT identity transform with <xsl:output indent="no">
および <xsl:strip-space elements="*"/>
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="no" />
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
意味のない空白は削除され、投稿した期待される出力が生成されます。
// 1. Read xml from file to StringBuilder (StringBuffer)
// 2. call s = stringBuffer.toString()
// 3. remove all "\n" and "\t":
s.replaceAll("\n","");
s.replaceAll("\t","");
編集済み:
私は小さな間違いを犯しました、あなたの場合はStringBuilderを使用する方が良いです(スレッドセーフなStringBufferは必要ないと思います)
ファイルを開いて読み取ります。
Reader r = new BufferedReader(filename);
String ret = "";
while((String s = r.nextLine()!=null))
{
ret+=s;
}
return ret;
Dom4jを使用してプリティプリントを行うコードを提供するこの回答を使用 、出力形式を設定する行をcreatePrettyPrint()
からcreateCompactFormat()
に変更します
public String unPrettyPrint(final String xml){
if (StringUtils.isBlank(xml)) {
throw new RuntimeException("xml was null or blank in unPrettyPrint()");
}
final StringWriter sw;
try {
final OutputFormat format = OutputFormat.createCompactFormat();
final org.dom4j.Document document = DocumentHelper.parseText(xml);
sw = new StringWriter();
final XMLWriter writer = new XMLWriter(sw, format);
writer.write(document);
}
catch (Exception e) {
throw new RuntimeException("Error un-pretty printing xml:\n" + xml, e);
}
return sw.toString();
}
In Java 1.8以降
BufferedReader br = new BufferedReader(new FileReader(filePath));
String content = br.lines().collect(Collectors.joining("\n"));
上記のソリューションは、XMLドキュメント内のすべての空白を圧縮している場合に機能します。その他のクイックオプションは、XMLドキュメントを出力するときのJDOM(Format.getCompactFormat()を使用)およびdom4j(OutputFormat.createCompactFormat()を使用)です。
ただし、要素のテキスト値に含まれる空白を保持するという独自の要件があり、これらのソリューションは必要に応じて機能しませんでした。必要なのは、XMLドキュメントに追加された「きれいな印刷」フォーマットを削除することだけでした。
私が思いついた解決策は、解決策のアルゴリズムを理解するために、次の3ステップ/正規表現プロセスで説明できます。
String regex, updatedXml;
// 1. remove all white space preceding a begin element tag:
regex = "[\\n\\s]+(\\<[^/])";
updatedXml = originalXmlStr.replaceAll( regex, "$1" );
// 2. remove all white space following an end element tag:
regex = "(\\</[a-zA-Z0-9-_\\.:]+\\>)[\\s]+";
updatedXml = updatedXml.replaceAll( regex, "$1" );
// 3. remove all white space following an empty element tag
// (<some-element xmlns:attr1="some-value".... />):
regex = "(/\\>)[\\s]+";
updatedXml = updatedXml.replaceAll( regex, "$1" );
注:擬似コードはJava ...にあります。 '$ 1'は最初のキャプチャグループである置換文字列です。
これにより、「pretty-print」形式をXMLドキュメントに追加するときに使用される空白が削除されますが、要素テキスト値の一部である場合、他のすべての空白は保持されます。
読み、空白を無視して、もう一度書きたいと思います。ほとんどのXMLパッケージには、空白を無視するオプションがあります。たとえば、DocumentBuilderFactoryには、この目的のために setIgnoringElementContentWhitespace があります。
同様に、オブジェクトをマーシャリングしてXMLを生成する場合、JAXBには JAXB_FORMATTED_OUTPUT
nderscore-Java ライブラリには静的メソッドU.formatXml(xmlstring)があります。私はプロジェクトのメンテナーです。 実例
import com.github.underscore.lodash.U;
import com.github.underscore.lodash.Xml;
public class MyClass {
public static void main(String[] args) {
System.out.println(U.formatXml("<a>\n <b></b>\n <b></b>\n</a>",
Xml.XmlStringBuilder.Step.COMPACT));
}
}
// output: <a><b></b><b></b></a>