【问题标题】:Replace XML self-closing tag with empty one用空的替换 XML 自闭合标记
【发布时间】:2011-05-09 15:36:54
【问题描述】:

我必须比较 XML 数据。有两个来源-

  • 网络服务
  • XML 文件

我没有看到任何简单的方法可以将它们转换为相同的类并使用 equals 方法。

使用 Web 服务的类是自动生成的,WSDL 一点也不简单。

所以我从 Web 服务读取响应,读取相应文件,将它们转换为具有相同格式(删除空格、\n\r 字符等)的字符串,然后使用 String.equals() 方法。

问题是 Web 服务的空标签是按以下方式编写的:

<EmptyTag/>

但提供的文件包含这种空标签:

<EmptyTag></EmptyTag>

好的,有一种方法可以手动准备所有提供的文件,但我不喜欢它。 谁知道,如何将空标签转换为相同的样式? 如果有任何想法如何简化流程 - 欢迎您;)

更新

我不解析 xml。 文件的数据只是被读取并转换为预期的格式。 来自 Web Service 响应的对象结构通过以下方式转换为 xml 字符串:

    marshaller.marshal(new JAXBElement<response_class_name>(new QName("response_class_name"),
       response_class_name.class, response_object), stringWriter);

【问题讨论】:

  • 你可以用正则表达式替换来做到这一点,但我对我的正则表达式技能没有足够的信心来发布答案。
  • 你是如何解析 XML 的?我曾经使用过的每个 XML 解析库都以不透明的方式处理这种情况(这意味着您永远不必自己处理它)。如果您自己解析 XML(使用 substring、indexof 等),那就是您的问题了。
  • @MusiGenesis - 请查看更新后的问题。
  • 如果我理解您的编辑,那么您根本没有解析 XML 响应 - 您只是将响应作为整个字符串进行检查。相反,您应该使用解析器来提取&lt;EmptyTag&gt; 元素的内部内容;无论标签的结构如何(&lt;EmptyTag/&gt;&lt;EmptyTag&gt;&lt;/EmptyTag&gt;),它都应该正确返回 "",或者如果标签甚至不存在,它将返回 null。
  • Underscore-java 库可以读取 xml 到 map 并从 map 生成 xml。支持自闭标签。

标签: java xml compare


【解决方案1】:

对于 Java,我会使用 XMLUnit 来比较文件,因为它使用 xml 文件的结构而不是字符串来比较文件(它可能会或可能不会忽略空格,具体取决于设置)。

【讨论】:

    【解决方案2】:

    xmllint 程序可以解决问题:

    $ echo '<EmptyTag></EmptyTag>' | xmllint -
    <?xml version="1.0"?>
    <EmptyTag/>
    

    【讨论】:

    • 我认为他想要相反的结果。
    【解决方案3】:

    您可以使用 Java 的正则表达式模块将所有出现的 "&lt;([^/]+?)/&gt;" 替换为 "&lt;\\1&gt;&lt;/\\1&gt;"。这会将第一个表单(“”)扩展为第二个表单(“”)。

    【讨论】:

      【解决方案4】:

      您可以事先将"&lt;(\\w+)([^&gt;]*)?&gt;\\s*&lt;/\\1&gt;" 替换为"&lt;$1$2 /&gt;"

      edit"&lt;(\\w+)( [^/&gt;]*)?/&gt;""&lt;$1$2&gt;&lt;/$1&gt;" 反之;)

      【讨论】:

      • 我只需要空标签。在这种情况下搜索正则表达式是不正确的。但是替换部件正在工作,谢谢;)
      【解决方案5】:

      有两种选择:

      1. 您可以使用XMLUnit 之类的内容来比较文档,以确保它们在语义上是等效的。
      2. 您可以使用相同的解析器读取两个 xml 文件,然后使用相同的序列化程序将它们写回字符串。序列化程序应该始终如一地处理自闭合标签。

      【讨论】:

        【解决方案6】:

        我可能会使用 XSLT 将两个 xml 文件转换为相同的格式,但我不知道这是否是最简单的方法。可能有编辑器可以为您进行格式化。

        【讨论】:

        • 嗯,这是一个用 Java 编写的应用程序。我不能使用任何编辑器。
        猜你喜欢
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多