Java XML 输出 - 对子项进行正确缩进
Java XML 输出 - 对子项进行正确缩进
我想将一些简单的数据模型序列化为xml,我一直在使用标准的java.org.w3c相关代码(见下文),缩进比没有"OutputKeys.INDENT"要好,但是仍然有一个小问题-子元素的正确缩进。
我知道之前有人问过这个问题(在stackoverflow上),但是那个配置对我没有起作用,这是我正在使用的代码:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.newDocument(); doc = addItemsToDocument(doc); // The addItemsToDocument method adds childElements to the document. TransformerFactory transformerFactory = TransformerFactory.newInstance(); transformerFactory.setAttribute("indent-number", new Integer(4)); // switching to setAttribute("indent-number", 4); doesn't help Transformer transformer = transformerFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.METHOD, "xml"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(outFile); // outFile is a regular File outFile = new File("some/path/foo.xml"); transformer.transform(source, result);
生成的输出如下:
而我想要的输出(为了更清晰)如下:
我只是想知道是否有办法做到这一点,让子元素正确缩进。
提前谢谢!
复活节快乐编码 :-)!
Java的XML输出中,对于子项的适当缩进是一个常见的问题。在这个问题中,文档的输出不会按照预期的方式缩进子项。
解决这个问题的方法是使用Java的Transformer类来设置输出属性。在给定的代码片段中,首先创建了一个TransformerFactory实例,然后使用该实例创建了一个Transformer实例。接下来,通过调用setOutputProperty()方法,设置了两个输出属性。第一个属性是OutputKeys.INDENT,它被设置为"yes",表示在输出时进行缩进。第二个属性是"{http://xml.apache.org/xslt}indent-amount",它被设置为"4",表示每个缩进级别使用4个空格。最后,使用transform()方法将源DOM对象doc转换为输出结果,并将结果写入文件或System.out。
然而,有一个用户在问题中表示这种方法对他不起作用。他在问题中提供了一个链接,该链接指向了一个相关的问题。根据他的描述,这个问题在后来的库版本中得到了修复。
总结起来,解决Java XML输出中子项缩进的问题,可以通过使用Transformer类的setOutputProperty()方法来设置输出属性。在这个问题中,属性OutputKeys.INDENT被设置为"yes",表示进行缩进,属性"{http://xml.apache.org/xslt}indent-amount"被设置为"4",表示每个缩进级别使用4个空格。然而,需要注意的是,有时候这种方法可能不起作用,可能需要查看相关的库版本或其他解决方案。
问题的原因是代码中使用了com.sun.org.apache.xml.internal.serializer.OutputPropertiesFactory这个类,这是一个Sun私有的包,不建议在代码中使用。解决方法是避免使用com.sun.*包,并采用其他合适的方式来实现相同的功能。
Java XML Output - proper indenting for child items(Java XML输出-对子项进行适当的缩进)问题的出现是因为代码中使用了com.sun.org.apache.xml.internal.serializer.OutputPropertiesFactory这个类,而该类属于Sun私有的包,不建议在代码中使用。为了解决这个问题,我们需要避免使用com.sun.*包,并采用其他合适的方式来实现相同的功能。
在代码中,我们可以看到使用了OutputPropertiesFactory类的setOutputProperty方法来设置输出属性。其中,S_KEY_INDENT_AMOUNT属性用于设置缩进的空格数为4。然而,由于该类属于Sun私有的包,使用这个包的代码可能会导致一些问题。因此,我们需要寻找一个替代的解决方案。
为了避免使用com.sun.*包,我们可以查找其他可用的类或方法来实现相同的功能。可以通过使用Java提供的其他XML库或工具来实现XML输出并进行适当的缩进。例如,可以使用JAXB(Java Architecture for XML Binding)库来生成带有适当缩进的XML输出。
以下是一种替代的解决方案,使用JAXB库来进行XML输出并进行适当的缩进:
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import java.io.StringWriter; public class XmlOutputExample { public static void main(String[] args) { try { // 创建一个JAXB上下文 JAXBContext jaxbContext = JAXBContext.newInstance(YourClass.class); // 创建一个Marshaller Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setProperty("com.sun.xml.bind.indentString", " "); // 设置缩进为4个空格 // 创建一个输出流 StringWriter writer = new StringWriter(); // 将对象转换为XML并输出到writer YourClass obj = new YourClass(); marshaller.marshal(obj, writer); // 输出XML System.out.println(writer.toString()); } catch (JAXBException e) { e.printStackTrace(); } } }
通过使用JAXB库中的JAXBContext、Marshaller和相关属性,我们可以实现XML输出并进行适当的缩进。在上面的示例中,我们创建了一个JAXB上下文和Marshaller,然后设置了JAXB_FORMATTED_OUTPUT属性为true,这将启用缩进。我们还通过设置com.sun.xml.bind.indentString属性为4个空格来定义缩进的空格数。
最后,我们将对象转换为XML并输出到StringWriter对象中,然后将其打印出来。这样就实现了XML输出并进行了适当的缩进。
总结一下,为了解决Java XML输出中子项适当缩进的问题,我们需要避免使用com.sun.*包,并寻找其他可用的库或工具来实现相同的功能。在这种情况下,我们可以使用JAXB库来实现XML输出并进行适当的缩进。通过设置JAXB的相关属性,我们可以控制缩进的格式和空格数。这样,我们就可以实现对子项进行适当的缩进。
问题出现的原因是在Java中输出XML时,子项的缩进格式不正确。解决方法是使用Xalan-J的Transformer实现,并设置输出属性"{http://xml.apache.org/xslt}indent-amount"为"5"。具体代码如下:
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "5");
更多详细答案请参考以下链接:http://xml.apache.org/xalan-j/usagepatterns.html
还可以参考这个链接:stackoverflow.com/questions/139076/…