java - 用 Java 生成 XML 内容的正确方法是什么?

标签 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 文件,我只需要将其内容传递给网络服务即可。

所以我的问题是,哪种方法才是正确的做法?

  • 按照现在的方式连接字符串?
  • 使用像 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,这是我非常喜欢的一种方法,因为我已经使用过这个框架,而且它是一个非常简单的框架。

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

最佳答案

这完全取决于上下文。没有单一的“正确方法”。

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

对于小型 XML,这很好。

但对于较大的,这可能会很痛苦。

如果您的大部分 XML 都是样板文件,只插入了几个值,您可能会发现使用诸如 Velocity 或其他几个库中的任何一个的模板可能非常有效。它有助于使模板保持“ native ”(您不必将其包装在 "'s 中并对其进行转义),而且它使 XML 远离您的代码,但可以轻松地让您在需要执行的部分中添加标记。

关于java - 用 Java 生成 XML 内容的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34997743/

相关文章:

php - 使用 PHP 从 HTML 列表生成 XML

.net - 温莎城堡 : How to wire up a component to a factory property rather than method

Iphone:对于这个特定问题,SAX 还是 DOM 更好?

java - SWI Prolog Java jpl.PrologException 查询不起作用

java - 如何求和之字形算法

java - 如何从 WEB-INF 加载 'mini' spring 上下文以初始化真实的应用程序上下文

java - android:checkableBehavior 以编程方式设置

android - DOM 或 SAX 解析示例

java - 使用 Java SAX 解析 XML 文档时出现问题

java - 禁用奥利奥通知点