Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何取消xml文件的格式化_Java_Xml_Format_String Formatting - Fatal编程技术网

Java 如何取消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的
字符串。该方法从服务器上的文件读取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点),你说的“非精确”序列化是什么意思?(对不起,我不明白你的意思,但我对它有点陌生:))。关于第三点,你说规范化是什么意思?。再次感谢你的帮助