代码之家  ›  专栏  ›  技术社区  ›  Artanis Zeratul

JAXB Marshaller和输出XML的格式化

  •  1
  • Artanis Zeratul  · 技术社区  · 6 年前


    JAXB Marshaller indentation

    但我遇到了一个错误:

    org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.
    

    这实际上与我使用的元帅有关:

    marshaller.marshal(instance, domResult);
    

    非常感谢您的评论和意见。

    干杯,
    阿塔尼斯·泽拉图尔

    1 回复  |  直到 6 年前
        1
  •  3
  •   Artanis Zeratul    6 年前

    我把安东尼奥·玛丽亚·桑切斯的答案稍加修改,解决了我的问题。
    JAXB Marshaller indentation


    所以我的答案是:

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.StringReader;
    import java.io.StringWriter;
    
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBException;
    import javax.xml.bind.Marshaller;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.stream.StreamResult;
    import javax.xml.transform.stream.StreamSource;
    
    public class ObjectToXMLWriter {
        public static <Type> boolean writeToFileWithXmlTransformer(Type instance
                ,String fullFileNamePath) throws FileNotFoundException {
            boolean isSaved = false;
            JAXBContext jaxBContent = null;
            Marshaller marshaller = null;
            StringWriter stringWriter = new StringWriter();
    
            try {
                jaxBContent = JAXBContext.newInstance(instance.getClass());
                marshaller = jaxBContent.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
                marshaller.marshal(instance, stringWriter);
    
                Transformer transformer = TransformerFactory.newInstance().newTransformer();
                transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
    
                transformer.transform(new StreamSource(new StringReader(stringWriter.toString()))
                        ,new StreamResult(new File(fullFileNamePath)));
    
               isSaved = true; 
            } catch(JAXBException jaxBException) {
                System.out.println("JAXBException happened!");
                jaxBException.printStackTrace();
            } catch(Exception exception) {
                System.out.println("Exception happened!");
                exception.printStackTrace();
            }
    
            return isSaved;
        }
    }
    


    这个答案的关键点如下:

    • marshaller.marshal(实例,stringWriter);
    • transformer.transform(新StreamSource(新StringReader(stringWriter.toString())) ,new StreamResult(新文件(fullFileNamePath));
      • 而不是使用DOMSource


    干杯,