Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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_Groovy_Io - Fatal编程技术网

Java 转换表示为可写XML数据的高效性能方法

Java 转换表示为可写XML数据的高效性能方法,java,xml,groovy,io,Java,Xml,Groovy,Io,我正在研究一种实用方法,它允许将XML数据转换成格式化的字符串,在您认为这对于javax.XML.transform.Transformer来说是一项微不足道的任务之前,让我解释一下我所面临的具体约束 转换开始时,输入数据不存在。实际上,它被表示为groovy.lang.Writeable()实例,我可以将其输出到任何java.io.Writer实例中。方法的签名如下所示: static String serializeToString(Writable source) 我目前的解决方案只涉及

我正在研究一种实用方法,它允许将XML数据转换成格式化的
字符串
,在您认为这对于
javax.XML.transform.Transformer
来说是一项微不足道的任务之前,让我解释一下我所面临的具体约束

转换开始时,输入数据不存在。实际上,它被表示为
groovy.lang.Writeable
()实例,我可以将其输出到任何
java.io.Writer
实例中。方法的签名如下所示:

static String serializeToString(Writable source)
我目前的解决方案只涉及几个步骤,实际上提供了预期的结果:

  • 创建
    StringWriter
    ,在那里输出
    source
    ,并转换为
    String
  • 基于此字符串创建
    javax.xml.transform.stream.StreamSource
    实例(使用
    StringReader
  • 创建新的
    StringWriter
    实例,并将其包装到
    javax.xml.transform.stream.StreamResult
  • 使用
    javax.xml.transform.Transformer的实例执行转换
  • StringWriter
    转换为
    String
  • 虽然这个解决方案确实有效,但我对它的效率还不够满意。这种方法会经常使用,我确实想优化它。我想避免的是必须沿线路执行多次转换:

  • 可写
    字符串
    (未格式化)
  • String
    StreamSource
    (这意味着将再次解析数据)
  • 再次从
    StreamSource
    String
    (格式化)
  • 所以问题是,是否有可能建立管道状的流动,从而消除不必要的转换

    更新#1:

    为了提供更多的上下文,我使用StreamingMarkupBuilder.bindNode()
    方法将
    GPathResult
    实例转换为格式化字符串,该方法生成
    Writable
    实例。不幸的是,无法指定
    StreamingMarkupBuilder
    来生成格式化输出

    更新#2:


    我曾尝试过基于PipedWriter+PipedReader的实现,但实验并没有显示这种方法有多大的速度提升。看来这不是这个案子的关键问题

    不知道“XML数据”的确切含义,但可以考虑将“尚未成为”的内容直接表示为SAXSource,从而传递“to string”和“parse string”步骤

    为什么要解析刚才生成的XML字符串?因为我想得到格式化的输出(即缩进),而可写输出是未格式化的字符串。所以您希望它性能高效且美观?;)不能将可写文件更改为漂亮的格式吗?彼得,我同意美化可能对性能有害,但这是我的要求。我试图避免的是来回解析/序列化XML。我编辑了这篇文章,为这个实用方法增加了一些清晰度。正如我所说的,如果可写文件产生了您所需要的漂亮输出,那么就不需要解析它,也不会对性能造成太大影响(除了使XML比需要的更大之外)不幸的是,SAXSource基于InputStream或Reader,而我基本上从WriterNo开始,SAXSource有一个getXMLreader()方法。可以对其进行安排,以便XMLreader的parse()方法开始生成SAX事件。这些事件将直接取决于源对象的内部结构。根据,首先不可能更改XML的生成方式(请参阅我文章中的更新#1)。不过,如果您有一个GPathResult,在我看来,您应该能够导航它和generate SAXEvents。但是,我只是简单地重新阅读了裸Javadoc.Per,经过一点思考,我认为您的想法可能会有所帮助。我可以基于可写实例实现SAXSource(不确定这是否容易做到)。对于这个+1