代码之家  ›  专栏  ›  技术社区  ›  Lehane

Java中的StxXML格式设置

  •  20
  • Lehane  · 技术社区  · 17 年前

    是否可以使用statx(特别是woodstox)用换行符和制表符来格式化输出XML,即:

    <element1>
      <element2>
       someData
      </element2>
    </element1>
    

    而不是:

    <element1><element2>someData</element2></element1>

    如果这在伍德斯托克斯是不可能的,还有其他轻量的libs可以做到这一点吗?

    10 回复  |  直到 7 年前
        1
  •  8
  •   Josh    11 年前

    通过JDK: transformer.setOutputProperty(OutputKeys.INDENT, "yes"); .

        2
  •  22
  •   Juha Syrjälä    15 年前

    有com.sun.xml.txw2.output.indentingxmlstreamwriter

    XMLOutputFactory xmlof = XMLOutputFactory.newInstance();
    XMLStreamWriter writer = new IndentingXMLStreamWriter(xmlof.createXMLStreamWriter(out));
    
        3
  •  6
  •   ewernli    12 年前

    如果使用的是stax光标API,则可以通过将xmlstreamwriter包装在 indenting proxy . 我在自己的项目中尝试过这个方法,效果很好。

        4
  •  4
  •   Thad    12 年前

    我建议下载 StAX utility classes 来自Java.net。此包包含一个工作良好的indentingXMLStreamWriter类。(源代码和javadoc包含在下载中。)

        5
  •  4
  •   Roland    9 年前

    使用JDK Transformer :

    public String transform(String xml) throws XMLStreamException, TransformerException
    {
        Transformer t = TransformerFactory.newInstance().newTransformer();
        t.setOutputProperty(OutputKeys.INDENT, "yes");
        t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
        Writer out = new StringWriter();
        t.transform(new StreamSource(new StringReader(xml)), new StreamResult(out));
        return out.toString();
    }
    
        6
  •  4
  •   Neeme Praks Tim Pote    8 年前

    怎么样 StaxMate :

    http://www.cowtowncoder.com/blog/archives/2006/09/entry_21.html

    适用于Woodstox,速度快,内存使用率低(没有内置内存树),缩进如下:


    SMOutputFactory sf = new SMOutputFactory(XMLOutputFactory.newInstance());
    SMOutputDocument doc = sf.createOutputDocument(new FileOutputStream("output.xml"));
    doc.setIndentation("\n ", 1, 2); // for unix linefeed, 2 spaces per level    
    // write doc like:    
    SMOutputElement root = doc.addElement("element1");    
    root.addElement("element2").addCharacters("someData");    
    doc.closeRoot(); // important, flushes, closes output
    

        7
  •  1
  •   Spencer Kormos    17 年前

    如果您使用的是迭代方法(xmleEventReader),那么在写入XML文件时,不能在相关的xmleEvents上附加一个新行\n'字符吗?

        8
  •  1
  •   Community Mohan Dere    8 年前

    不确定Stax,但最近有一个关于漂亮打印XML的讨论

    pretty print xml from java

    这是我试图解决的问题

    How to pretty print XML from Java?

    使用 org.dom4j.io.outputformat.createpretyprint()。 方法

        9
  •  0
  •   Sebastien Lorber    12 年前

    对于Spring批处理,这需要一个子类,因为 JIRA BATCH-1867

    public class IndentingStaxEventItemWriter<T> extends StaxEventItemWriter<T> {
    
      @Setter
      @Getter
      private boolean indenting = true;
    
      @Override
      protected XMLEventWriter createXmlEventWriter( XMLOutputFactory outputFactory, Writer writer) throws XMLStreamException {
        if ( isIndenting() ) {
          return new IndentingXMLEventWriter( super.createXmlEventWriter( outputFactory, writer ) );
        }
        else {
          return super.createXmlEventWriter( outputFactory, writer );
        }
      }
    
    }
    

    但这需要一个附加的依赖项,因为Spring批处理不包括缩进statx输出的代码:

    <dependency>
      <groupId>net.java.dev.stax-utils</groupId>
      <artifactId>stax-utils</artifactId>
      <version>20070216</version>
    </dependency>
    
        10
  •  0
  •   Nh Wh    7 年前

    如果您使用的是XMLEventWriter,那么一种更简单的方法是:

    XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
            XMLEventWriter writer = outputFactory.createXMLEventWriter(w);
            XMLEventFactory eventFactory = XMLEventFactory.newInstance();
            Characters newLine = eventFactory.createCharacters("\n"); 
            writer.add(startRoot);
            writer.add(newLine);