Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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
Java1.6:javax.xml.transform.Transformer拒绝缩进包含换行符的xml字符串_Java_Xml_Jdk1.6_Indentation_Transformer - Fatal编程技术网

Java1.6:javax.xml.transform.Transformer拒绝缩进包含换行符的xml字符串

Java1.6:javax.xml.transform.Transformer拒绝缩进包含换行符的xml字符串,java,xml,jdk1.6,indentation,transformer,Java,Xml,Jdk1.6,Indentation,Transformer,我需要能够使用JavaAPI漂亮地打印xml字符串,并且已经在web和这个特定网站上找到了多种解决方案。然而,尽管多次尝试使用javax.xml.transform.Transformer实现这一点,但到目前为止还是失败了。 下面我提供的代码仅在参数中的xml字符串不包含xml元素之间的任何换行符时部分起作用。这不行。我需要能够很好地打印任何内容,假设它是格式良好且有效的xml,甚至是以前打印得很好的字符串 我得到了这个(根据我发现的代码片段,人们声称它对他们有用): import java.i

我需要能够使用JavaAPI漂亮地打印xml字符串,并且已经在web和这个特定网站上找到了多种解决方案。然而,尽管多次尝试使用javax.xml.transform.Transformer实现这一点,但到目前为止还是失败了。 下面我提供的代码仅在参数中的xml字符串不包含xml元素之间的任何换行符时部分起作用。这不行。我需要能够很好地打印任何内容,假设它是格式良好且有效的xml,甚至是以前打印得很好的字符串

我得到了这个(根据我发现的代码片段,人们声称它对他们有用):

import java.io.*;
导入javax.xml.transform.*;
导入javax.xml.transform.stream.*;
公共类XML格式化程序{
公共静态字符串格式(字符串xml、整数缩进、布尔省略xml声明)
抛出TransformerException{
如果(缩进<0){
抛出新的IllegalArgumentException();
}
字符串ret=null;
StringReader=新的StringReader(xml);
StringWriter编写器=新的StringWriter();
试一试{
TransformerFactory=TransformerFactory.newInstance();
setAttribute(“缩进数”,新整数(缩进));
变压器=工厂新变压器();
if(省略XML声明){
transformer.setOutputProperty(
OutputKeys.OMIT_XML_声明“yes”);
}
transformer.setOutputProperty(OutputKeys.INDENT,“是”);
transformer.setOutputProperty(
"{http://xml.apache.org/xslt}缩进金额“,
字符串.valueOf(缩进));
setOutputProperty(OutputKeys.METHOD,“xml”);
变形金刚(
新StreamSource(读卡器),
新的StreamResult(writer));
ret=writer.toString();
}捕获(TransformerException ex){
掷骰子;
}最后{
if(读卡器!=null){
reader.close();
}
试一试{
if(writer!=null){
writer.close();
}
}catch(IOException ex){}
}
返回ret;
}
公共静态void main(字符串[]args)引发TransformerException{
StringBuilder sb=新的StringBuilder();
某人加上(“”);
System.out.println(sb.toString());
System.out.println();
System.out.println(XMLFormatter.format(sb.toString(),4,false));
最后一个字符串NEWLINE=System.getProperty(“line.separator”);
sb.设定长度(0);
sb.append(“”);sb.append(换行符);
sb.append(“”);sb.append(换行符);
sb.append(“”);sb.append(换行符);
sb.append(“”);sb.append(换行符);
某人加上(“”);
System.out.println(sb.toString());
System.out.println();
System.out.println(XMLFormatter.format(sb.toString(),4,false));
}
}
这段代码不应该被这些新行所困扰,是吗?这是一个错误还是我遗漏了一些重要的东西?代码段的输出:

<rpc-reply><data><smth/></data></rpc-reply>

<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply>
    <data>
        <smth/>
    </data>
</rpc-reply>

<rpc-reply>
<data>
<smth/>
</data>
</rpc-reply>

<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply>
<data>
<smth/>
</data>
</rpc-reply>

据我所知,我的代码与其他示例的不同之处在于,我使用StringWriter和StringReader进行转换(in,out)方法。我已经尝试过将xml转换为ByteArrayOutputStream,甚至用DOM对其进行解析,然后将其提供给transformer,但结果是一样的。 我很想知道为什么这只适用于单行字符串

我正在使用jdk1.6_24与Netbeans 6.9.1相结合

这个问题与(可能与许多其他问题)有关,但与以下问题不同:


我得出结论,这是变压器的正常行为。甚至更多。它的缩进功能并不意味着要作为一个漂亮的打印机,而不是在它自己的任何方式。当XML被很好地打印出来时,它的结构会发生变化,除非您确切地知道文档应该是什么样子(基于它的XSD、DTD或类似内容)。这是确定哪些换行符被视为可忽略空白以及哪些是实际元素值或其一部分的唯一方法。Transformer不会重新格式化现有的空白,这就是为什么我的代码的输出是这样的

因此,如果您想使用Transformer或任何其他类漂亮地打印一个已经打印好的XML字符串,首先必须去掉可忽略的空白,唯一安全地做到这一点的方法是知道XML文档的结构应该是什么样的。我希望有人能为我确认这一说法,因为这只是我目前的假设。如果这句话是正确的;第三方漂亮的打印机是如何做到的?我知道JTidy不需要XSD,但无论如何都打印得很好。它是否只是将所有空白视为可忽略的空白,除非它包含在文本XML节点中?是否有其他确定和消除可忽略空白的方法

<rpc-reply><data><smth/></data></rpc-reply>

<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply>
    <data>
        <smth/>
    </data>
</rpc-reply>

<rpc-reply>
<data>
<smth/>
</data>
</rpc-reply>

<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply>
<data>
<smth/>
</data>
</rpc-reply>