如何取消格式化xml文件

时间:2011-12-12 15:03:38

标签: java xml format string-formatting

我有一个方法,它返回带有格式化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>

有一种简单的方法吗?

7 个答案:

答案 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(), " ")