我有一个方法,它返回带有格式化xml的String
。该方法从服务器上的文件中读取xml并将其解析为字符串:
这个方法目前的用途是:
private ServletConfig config;
InputStream xmlIn = null ;
xmlIn = config.getServletContext().getResourceAsStream(filename + ".xml") ;
String xml = IOUtils.toString(xmlIn);
IOUtils.closeQuietly(xmlIn);
return xml;
我需要做的是添加一个新的输入参数,并根据该值继续返回格式化的xml,或返回未格式化的xml。
我对格式化的xml的意思是:
<xml>
<root>
<elements>
<elem1/>
<elem2/>
<elements>
<root>
</xml>
我对未格式化的xml的意思是:
<xml><root><elements><elem1/><elem2/><elements><root></xml>
或:
<xml>
<root>
<elements>
<elem1/>
<elem2/>
<elements>
<root>
</xml>
有一种简单的方法吗?
答案 0 :(得分:1)
使用String xml = IOUtils.toString(xmlIn).replace("\n", "")
删除所有换行符。或\t
保留多行,但没有缩进。
答案 1 :(得分:1)
尝试以下内容:
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(
new StreamSource(new StringReader(
"<xsl:stylesheet version=\"1.0\"" +
" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">" +
"<xsl:output method=\"xml\" omit-xml-declaration=\"yes\"/>" +
" <xsl:strip-space elements=\"*\"/>" +
" <xsl:template match=\"@*|node()\">" +
" <xsl:copy>" +
" <xsl:apply-templates select=\"@*|node()\"/>" +
" </xsl:copy>" +
" </xsl:template>" +
"</xsl:stylesheet>"
))
);
Source source = new StreamSource(new StringReader("xml string here"));
StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);
如果你想要在保存之前修改DOM,那么如果你有一个内存中StreamSource
,它也可以是DOMSource
,而不是第二个实例中的Document
。 / p>
DOMSource source = new DOMSource(document);
将XML文件读入Document
对象:
File file = new File("c:\\MyXMLFile.xml");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(file);
doc.getDocumentElement().normalize();
享受:)
答案 2 :(得分:0)
您可以: 1)删除所有连续的空格(但不是单个空格),然后替换所有&gt;(空格)&lt;通过&gt;&lt; 仅当有用内容没有多个连续的重要空格时才适用 2)在某个dom树中读取它并使用一些非优化的序列化序列化它
SAXReader reader = new SAXReader();
Reader r = new StringReader(data);
Document document = reader.read(r);
OutputFormat format = OutputFormat.createCompactFormat();
StringWriter sw = new StringWriter();
XMLWriter writer = new XMLWriter(sw, format);
writer.write(document);
String string = writer.toString();
3)使用Canonicalization(但你必须以某种方式向它解释你要删除的那些空格是无关紧要的)
答案 3 :(得分:0)
如果你喜欢用JAXB尝试你的手,那么marshaller有一个方便的属性来设置是否格式化(使用换行和缩进)输出。
JAXBContext jc = JAXBContext.newInstance(packageName);
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
m.marshal(element, outputStream);
虽然进入那个阶段的开销很大......如果你已经拥有一个稳定的xsd,也许是个不错的选择
答案 4 :(得分:0)
如果您确定格式化 xml,请执行以下操作:
<xml>
<root>
<elements>
<elem1/>
<elem2/>
<elements>
<root>
</xml>
您可以将^(\s*)<
中的所有第1组替换为“”。这样,xml中的文本将不会被更改。
答案 5 :(得分:0)
一个空转换器,参数设置缩进参数如此
public static String getStringFromDocument(Document dom, boolean indented) {
String signedContent = null;
try {
StringWriter sw = new StringWriter();
DOMSource domSource = new DOMSource(dom);
TransformerFactory tf = new TransformerFactoryImpl();
Transformer trans = tf.newTransformer();
trans = tf.newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
trans.setOutputProperty(OutputKeys.INDENT, indented ? "yes" : "no");
trans.transform(domSource, new StreamResult(sw));
sw.flush();
signedContent = sw.toString();
} catch (TransformerException e) {
e.printStackTrace();
}
return signedContent;
}
适合我。
关键在于这一行
trans.setOutputProperty(OutputKeys.INDENT, indented ? "yes" : "no");
答案 6 :(得分:0)
Kotlin。
缩进通常在换行后出现并格式化为一个或多个空格。因此,为了使所有内容都在同一列中,我们将替换所有新行,并跟随一个或多个空格:
xmlTag = xmlTag.replace("(\n +)".toRegex(), " ")