将XML自关闭标记替换为空标记

时间:2011-05-09 15:36:54

标签: java xml compare

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

  • 网络服务
  • XML文件

我没有看到任何简单的方法在同一个类中转换它们并使用equals方法。

使用Web Services的类是自动生成的,WSDL根本不简单。

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

问题是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);

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

您可以预先将"<(\\w+)([^>]*)?>\\s*</\\1>"替换为"<$1$2 />"

其他方面

修改"<(\\w+)( [^/>]*)?/>" "<$1$2></$1>";)

答案 3 :(得分:1)

程序xmllint可以解决这个问题:

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

答案 4 :(得分:1)

有两种选择:

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

答案 5 :(得分:0)

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