Java 如何取消xml文件的格式化
我有一个方法,它返回一个带有格式化xml的Java 如何取消xml文件的格式化,java,xml,format,string-formatting,Java,Xml,Format,String Formatting,我有一个方法,它返回一个带有格式化xml的字符串。该方法从服务器上的文件读取xml,并将其解析为字符串: 本质上,该方法目前的作用是: private ServletConfig config; InputStream xmlIn = null ; xmlIn = config.getServletContext().getResourceAsStream(filename + ".xml") ; String xml = IOUtils.toString(xmlIn);
字符串。该方法从服务器上的文件读取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><root><elements><elem1/><elem2/><elements><root></xml>
对于无格式xml,我的意思是:
<xml>
<root>
<elements>
<elem1/>
<elem2/>
<elements>
<root>
</xml>
<xml><root><elements><elem1/><elem2/><elements><root></xml>
或:
有一种简单的方法可以做到这一点吗?用字符串xml=IOUtils.toString(xmlIn).replace(“\n”,”)
剥离所有换行符。或\t
保留几行,但不缩进。使用字符串xml=IOUtils.toString(xmlIn)剥离所有换行字符。替换(“\n”,”)
。或\t
保留几行但不缩进。您可以:
1) 删除所有连续的空格(但不是单个空格),然后将所有>(空格)<
仅当有用内容没有多个连续的有效空格时才适用
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) 使用(但您必须以某种方式向其解释,您要删除的空白是无关紧要的)您可以:
1) 删除所有连续的空格(但不是单个空格),然后将所有>(空格)<
仅当有用内容没有多个连续的有效空格时才适用
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) 使用(但您必须以某种方式向其解释,您要删除的空白是无关紧要的)尝试以下操作:
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);
享受:)尝试以下方法:
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);
享受:)如果您想尝试使用JAXB,那么封送器有一个方便的属性来设置是否格式化(使用新行和缩进)输出
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,那么这可能是一个不错的选择。如果您想尝试使用JAXB,那么封送拆收器有一个方便的属性来设置是否格式化(使用新行和缩进)输出
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,那么这可能是一个不错的选择,如果您确信格式的xml类似于:
<xml>
<root>
<elements>
<elem1/>
<elem2/>
<elements>
<root>
</xml>
如果您确定^(\s*)格式的xml类似于:
<xml>
<root>
<elements>
<elem1/>
<elem2/>
<elements>
<root>
</xml>
您可以使用设置缩进参数的参数替换空转换器中的所有组1,如下所示
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");
一个空的转换器,其参数设置为缩进参数,如下所示
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");
Kotlin.
缩进通常位于新行之后,格式为一个空格或多个空格。因此,为了使所有内容都在同一列中,我们将在一个或多个空格后替换所有新行:
xmlTag = xmlTag.replace("(\n +)".toRegex(), " ")
Kotlin.
缩进通常位于新行之后,格式为一个空格或多个空格。因此,为了使所有内容都在同一列中,我们将在一个或多个空格后替换所有新行:
xmlTag = xmlTag.replace("(\n +)".toRegex(), " ")
它不起作用,我仍在将格式化的xml转换成“xml”变量:S,不知道为什么还要去掉“\r”。可能是窗户断线了String xml=IOUtils.toString(xmlIn).replace(“\n”,”).replace(“\r”,”)
将损坏标记值本身中可能存在的任何\r\n。并不是所有的回车都是用于格式化的,有些可能是数据本身的一部分。谢谢你,它终于起作用了,调试器没有向我显示真实性:)。你帮了我很多。谢谢所有帮助解决这个问题的人。@Newtopian:是的。但是对于OP的问题,它似乎足够简单和有效。它不起作用,我仍然将格式化的xml转换成“xml”变量:s,不知道为什么还要去掉“\r”。可能是窗户断线了String xml=IOUtils.toString(xmlIn).replace(“\n”,”).replace(“\r”,”)
将损坏标记值本身中可能存在的任何\r\n。并不是所有的回车都是用于格式化的,有些可能是数据本身的一部分。谢谢你,它终于起作用了,调试器没有向我显示真实性:)。你帮了我很多。谢谢所有帮助解决这个问题的人。@Newtopian:是的。但对于OP的问题,它似乎足够简单和有效。让我看看我是否理解,首先,谢谢你的回答:)。关于第1点,删除WiseSpaces似乎不太好,因为xml文件中的某些值可能包含空格,为什么您认为我应该删除连续空格?。关于第2点),你说的“非精确”序列化是什么意思?(对不起,我不明白你的意思,但我对它有点陌生:))。关于第三点,你说规范化是什么意思?。再次感谢您的帮助让我看看我是否理解,首先,感谢您的回答:)。关于第1点,删除WiseSpaces似乎不太好,因为xml文件中的某些值可能包含空格,为什么您认为我应该删除连续空格?。关于第2点),你说的“非精确”序列化是什么意思?(对不起,我不明白你的意思,但我对它有点陌生:))。关于第三点,你说规范化是什么意思?。再次感谢你的帮助