Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在比较XML文件时忽略xs:float(和其他类型)表示的差异_Java_Xml_Junit_Xmlunit - Fatal编程技术网

Java 在比较XML文件时忽略xs:float(和其他类型)表示的差异

Java 在比较XML文件时忽略xs:float(和其他类型)表示的差异,java,xml,junit,xmlunit,Java,Xml,Junit,Xmlunit,我正在使用它进行测试,我希望对其进行配置,以便忽略与某些类型的替代(但等效)呈现相关的差异。例如xs:float字段的3.14与3.140。我想一个完整的解决方案需要测试知道XSD,这样每个字段的类型都是已知的,并且在所有情况下都可以进行细微的比较(例如true/1对于xs:boolean,甚至可以考虑默认属性值)。无论如何,我愿意接受变通方法,这样我就可以在没有所有错误警报的情况下运行测试 下面给出了一个示例(没有JUnit机器,以便于复制): import org.custommonkey.

我正在使用它进行测试,我希望对其进行配置,以便忽略与某些类型的替代(但等效)呈现相关的差异。例如
xs:float
字段的
3.14
3.140
。我想一个完整的解决方案需要测试知道XSD,这样每个字段的类型都是已知的,并且在所有情况下都可以进行细微的比较(例如
true
/
1
对于
xs:boolean
,甚至可以考虑默认属性值)。无论如何,我愿意接受变通方法,这样我就可以在没有所有错误警报的情况下运行测试

下面给出了一个示例(没有JUnit机器,以便于复制):

import org.custommonkey.xmlunit.XMLTestCase;
import org.custommonkey.xmlunit.XMLUnit;
import org.custommonkey.xmlunit.Diff;


class XMLTestCaseConcrete extends XMLTestCase {
}


public class FooMain {

    public static void main(String args[]) throws Exception {
        String s1 = "<a>180</a>";
        String s2 = "<a>180.0</a>";
        Diff diff = XMLUnit.compareXML(s1, s2);
        System.out.printf("difference below:\n------\n%s\n------\n", diff);
        XMLTestCase xmlTest = new XMLTestCaseConcrete();
        xmlTest.assertXMLEqual(s1, s2);
    }    
}
import org.custommonkey.xmlunit.XMLTestCase;
导入org.custommonkey.xmlunit.xmlunit;
导入org.custommonkey.xmlunit.Diff;
类XmlTestCaseContracte扩展了XMLTestCase{
}
公共类FooMain{
公共静态void main(字符串args[])引发异常{
字符串s1=“180”;
字符串s2=“180.0”;
Diff Diff=XMLUnit.compareXML(s1,s2);
System.out.printf(“以下差异:\n-----------\n%s\n-----------\n”,差异);
XMLTestCase xmlTest=新的XMLTestCaseContracte();
assertXMLEqual(s1,s2);
}    
}

XMLUnit不支持模式,所以完整的解决方案将非常复杂。方法是实现一个定制的
DifferenceListener


example
包包含一个
FloatingPointTolerantDifferenceListener
,它可以满足您对任意文本节点或属性的需求,但它可以满足看起来像数字的所有要求,并且不处理任何其他模式类型或默认值。

DifferenceListener


example
包包含一个
FloatingPointTolerantDifferenceListener
,它可以满足您对任意文本节点或属性的需求,但是它可以处理所有看起来像数字的东西,并且它不处理任何其他模式类型或默认值。

最后,我在应用层实现了这一点,使用(内部化期间)一个自定义Java类来表示同样“记住”的
xs:float
它来自于确切的
String
表示,因此在后续的序列化过程中使用了完全相同的字符串形式(当然,假设在内部化后应用程序逻辑没有对其进行更改)。实际上,此解决方案与在java对象层将
xs:float
s视为
java.lang.String
s的更简单、更直接的解决方案之间的唯一区别是使用专门的
float
类型提供的附加语义信息


无论如何,这个解决方案允许我使用@Dave在对我的原始问题的评论中建议的测试方法,也允许我使用更严格的测试方法,即要求在一轮内部化序列化之后生成相同的XML。

最后,我通过使用(在内部化过程中)表示
xs:float
的自定义Java类,它还“记住”它来自的确切
String
表示,因此在后续序列化过程中使用完全相同的字符串形式(当然,假设内部化后应用程序逻辑没有对其进行更改)。实际上,此解决方案与在java对象层将
xs:float
s视为
java.lang.String
s的更简单、更直接的解决方案之间的唯一区别是使用专门的
float
类类型提供的附加语义信息


无论如何,这个解决方案允许我使用@Dave在对我的原始问题的评论中建议的测试方法,也允许我使用更严格的测试,即要求在一轮内部化序列化之后生成相同的XML。

既然您已经在生成和使用XML,我想您已经有了一个library,它从您自己的Java类中读取/写入XML。因此,我认为灵活处理格式的最简单方法是将XML解析为对象并比较这些对象。这就是我在检查JSON输出时处理这种灵活性的方式。至于XML级别,180和180.0的值在技术上是不同的(即180表示+/-0.5,而180.0表示+/-0.05),因此,如果你绝对需要灵活性,这听起来像是你自己的情况。当然,问问你自己是否应该允许这种灵活性也很重要。如果一种情况下的值可能是180,而另一种情况下的值可能是180.0,没有任何真正意义上的差异,那么可能规格太模糊了?因为你在生产和消费XML已经存在,我假设您有一个库,可以从您自己的Java类读取/写入XML。因此,我认为灵活处理格式的最简单方法是将XML解析为对象并比较这些对象。这就是我在检查JSON输出时处理这种灵活性的方式。至于XML级别,值180和180.0都是技术性的y不同(即180表示+/-0.5,而180.0表示+/-0.05),因此,如果你绝对需要灵活性,这听起来像是在你自己的情况下滚动。当然,问问自己是否应该允许这种灵活性也很重要。如果一种情况下的值可能是180,而另一种情况下的值可能是180.0,而没有任何真正意义上的差异,那么说明可能太模糊了?