Java 漂亮的打印XML文件 原始问题

Java 漂亮的打印XML文件 原始问题,java,xml,xslt,dom,java-8,Java,Xml,Xslt,Dom,Java 8,我正在尝试在没有任何外部库的情况下预打印XML文件,但无法让Java实现我想要的功能。。。这是我迄今为止的代码(我添加了类似问题的任何解决方案!): 具有如下所示的输入文件: <?xml version="1.0" encoding="UTF-8" standalone="no"?><root><test><item0>a</item0><item1>b</item1></test></root

我正在尝试在没有任何外部库的情况下预打印XML文件,但无法让Java实现我想要的功能。。。这是我迄今为止的代码(我添加了类似问题的任何解决方案!):

具有如下所示的输入文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><root><test><item0>a</item0><item1>b</item1></test></root>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>

<test>
<item0>a</item0>
<item1>b</item1>
    </test>
</root>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <test>
        <item0>a</item0>
        <item1>b</item1>
     </test>
 </root>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
<test>
<item0>a</item0>
<item1>b</item1>
</test>
</root>
<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output indent="yes"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
现在,这将从原始问题的单行文件创建一个漂亮的打印文件,从而回答部分问题!我不知道到底是什么问题,但不管怎样,现在起作用了^^

但我也有一些由我的程序读取和写入的旧文件,看起来像这样:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><root><test><item0>a</item0><item1>b</item1></test></root>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>

<test>
<item0>a</item0>
<item1>b</item1>
    </test>
</root>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <test>
        <item0>a</item0>
        <item1>b</item1>
     </test>
 </root>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
<test>
<item0>a</item0>
<item1>b</item1>
</test>
</root>
<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output indent="yes"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

A.
B

它们在每个节点后都有一个换行符,但没有缩进。我的代码保持文件不变。。。如何纠正这一点?

当您可以简单地使用进行转换时,为什么还要费心处理复杂且容易出错的Java代码,如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><root><test><item0>a</item0><item1>b</item1></test></root>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>

<test>
<item0>a</item0>
<item1>b</item1>
    </test>
</root>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <test>
        <item0>a</item0>
        <item1>b</item1>
     </test>
 </root>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
<test>
<item0>a</item0>
<item1>b</item1>
</test>
</root>
<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output indent="yes"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的XML文档时

<?xml version="1.0" encoding="UTF-8" standalone="no"?><root><test><item0>a</item0><item1>b</item1></test></root>
<?xml version="1.0" encoding="utf-8"?>
<root>
   <test>
      <item0>a</item0>
      <item1>b</item1>
   </test>
</root>
ab
生成一个漂亮的、更重要的是统一的(每个XSLT处理器)输出

<?xml version="1.0" encoding="UTF-8" standalone="no"?><root><test><item0>a</item0><item1>b</item1></test></root>
<?xml version="1.0" encoding="utf-8"?>
<root>
   <test>
      <item0>a</item0>
      <item1>b</item1>
   </test>
</root>

A.
B

您已经标记了此XSLT,如果应用了以下XSLT样式表:

XSLT1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
exclude-result-prefixes="xalan">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" xalan:indent-amount="4"/>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

对于XML输入,结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <test>
        <item0>a</item0>
        <item1>b</item1>
    </test>
</root>

A.
B
现场演示:

请注意,这些项目“印刷精美”,如下所示:

a
而不是如你的帖子所示:

<item0>
    a
</item0>

A.

这表示XML内容负载的变化。

运行代码时,
t工厂的类是什么?您使用什么JDK?tfactory是javax.xml.transform.TransformerFactory类型,我使用1.8.0_66-b18(2015年11月11日发布)以及
tfactory
的实现类是什么,即当您打印
System.out.println(tfactory.getClass())
class com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactory时,使用JDK 1.8.0_45(具有相同的transformer实现),我在运行代码时获得了一个漂亮的缩进输出。这在使用Xalan处理器时不会产生结果(OP显然是这样)-请参阅:中的固定内容不匹配question@user2336377你的问题没有回答吗?