在Java中生成XML内容的正确方法是什么?

时间:2016-01-25 16:43:26

标签: java xml sax stax

我已经通过互联网阅读了几个问题和教程,例如

但是因为这是我第一次用Java操作XML文档,所以我仍然有点困惑。 XML内容是用字符串连接编写的,这在我看来是错误的。连接字符串以生成JSON对象而不是使用JSONObject类是相同的。这就是现在编写代码的方式:

"<msg:restenv xmlns:msg=\"http://www.b2wdigital.com/umb/NEXM_processa_nf_xml_req\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.b2wdigital.com/umb/NEXM_processa_nf_xml_req req.xsd\"><autenticacao><usuario>"
            + usuario + "</usuario><senha>" + StringUtils.defaultIfBlank(UmbrellaRestClient.PARAMETROS_INFRA_UMBRELLA.get("SENHA_UMBRELLA"), "WS.INTEGRADOR")
            + "</senha></autenticacao><parametros><parametro><p_vl_gnre>" + valorGNRE + "</p_vl_gnre><p_cnpj_destinatario>" + cnpjFilial + "</p_cnpj_destinatario><p_num_ped_compra>" + idPedido
            + "</p_num_ped_compra><p_xml_sefaz><![CDATA[" + arquivoNfe + "]]></p_xml_sefaz></parametro></parametros></msg:restenv>"

在我的研究中,我认为我读过的几乎所有内容都指出SAX是最好的解决方案,但我从来没有真正找到一些非常有用的东西来阅读它,几乎所有的东西都表明我们必须创建一个处理程序并覆盖startElement,endElement和字符方法。

我不需要在硬盘或数据库或其他任何内容中序列化XML文件,我只需要将其内容传递给Web服务。

所以我的问题是,这是正确的方法吗?

  • 连接字符串现在就完成了事情?
  • 使用像Xerces这样的Java API编写XML文件?我不知道如何做到这一点。
  • 使用流读取XML文件并只更改节点文本?没有文件的我的XML就像那样:

    <msg:restenv xmlns:msg="{url}"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="{schemaLocation}">
        <autenticacao>
            <usuario></usuario>
            <senha></senha>
        </autenticacao>
        <parametros>
            <parametro>
                <p_vl_gnre></p_vl_gnre>
                <p_cnpj_destinatario></p_cnpj_destinatario>
                <p_num_ped_compra></p_num_ped_compra>
                <p_xml_sefaz><![CDATA[]]></p_xml_sefaz>
            </parametro>
        </parametros>
    </msg:restenv>
    
  • 我还阅读了一些关于使用Apache Velocity作为模板引擎的内容,因为我实际上不需要序列化XML,这是我非常喜欢的方法因为我已经使用过这个框架而且它是一个非常简单的框架。

同样,我不是在寻找最好的方法,但如果可能的话,还有正确的教程和示例,如何完成工作。

3 个答案:

答案 0 :(得分:3)

这一切都取决于背景。没有一种“正确的方式”。

串联的最大问题是将XML转换为String常量(这是繁琐的),但也可以转义可以使用的值,以便它们对XML文档是正确的。

对于小型XML,没关系。

但是对于较大的人来说,这可能是一种痛苦。

如果您的大多数XML都是样板文件,只插入了一些值,您可能会发现使用Velocity或任何其他几个库的模板可能非常有效。它有助于保持模板“本机”(您不必将其包装在“s”中并将其转义),此外它还可以使XML保持在代码之外,但可以轻松地标记您需要执行的部分。

答案 1 :(得分:1)

我同意这不是一种方法,但我建议你看一下JAXB。您可以轻松地使用和生成XML,而无需任何麻烦的字符串操作。在这里查看简单的介绍:https://docs.oracle.com/javase/tutorial/jaxb/index.html

答案 2 :(得分:1)

Answer by Will Hartung是正确的。没有一种正确的方法,因为这取决于你的情况。

对于初学者程序员,我建议手动编写字符串,这样您就可以理解XML,尤其是您的内容。至于字符串连接的机制,通常使用StringBuilder而不是String来获得更好的性能。如果需要线程安全,请使用StringBuffer

主要问题是记忆。

  • 丰富的内存
    如果您有大量内存和小型XML文档,则可以将整个文档加载到内存中。这样,您可以向前,向后遍历文档,并随意跳转。这种方法称为Document Object Model (DOM)。这种方法的一个更为人熟知的实现是Apache Xerces。还有其他很好的实现。
  • 稀缺内存
    如果您的内存和大型XML文档很少,那么您需要从头到尾浏览文档,一次咬掉小块以降低内存使用量。这种方法称为SAX。你可以找到多个好的实现。

另一个问题是验证。是否要针对DTDSchema验证XML文档?有些工具可以做到这一点,有些则没有。

当您只需要序列化Java对象的内容并将其读回时,我建议使用Simple XML Serialization库。与其他工具相比,学习曲线更快更简单。