Java XML 输出 - 对子项进行正确缩进

8 浏览
0 Comments

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);

生成的输出如下:







而我想要的输出(为了更清晰)如下:



  
    
  

我只是想知道是否有办法做到这一点,让子元素正确缩进。

提前谢谢!

复活节快乐编码 :-)!

0
0 Comments

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个空格。然而,需要注意的是,有时候这种方法可能不起作用,可能需要查看相关的库版本或其他解决方案。

0
0 Comments

问题的原因是代码中使用了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的相关属性,我们可以控制缩进的格式和空格数。这样,我们就可以实现对子项进行适当的缩进。

0
0 Comments

问题出现的原因是在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/…

0