package com.ibm.xpath2; import javax.xml.namespace.QName; import javax.xml.transform.stream.StreamSource; import com.ibm.xml.xapi.XDynamicContext; import com.ibm.xml.xapi.XFactory; import com.ibm.xml.xapi.XPathExecutable; import com.ibm.xml.xapi.XSequenceCursor; import com.ibm.xml.xapi.XSequenceType; import com.ibm.xml.xapi.XStaticContext; public class XMLCompare { public static void main(String[] args) throws Exception { String dataDir = System.getProperty("dataDir.path"); XFactory factory = XFactory.newInstance(); factory.setValidating(XFactory.FULL_VALIDATION); factory.registerSchema(new StreamSource(dataDir + "/test.xsd")); XStaticContext staticContext = factory.newStaticContext(); staticContext.declareVariable(new QName("doc1"), factory.getSequenceTypeFactory(). documentNode(XSequenceType.OccurrenceIndicator.ONE)); staticContext.declareVariable(new QName("doc2"), factory.getSequenceTypeFactory(). documentNode(XSequenceType.OccurrenceIndicator.ONE)); XDynamicContext dynamicContext = factory.newDynamicContext(); dynamicContext.bind(new QName("doc1"), new StreamSource(dataDir + "/test1.xml")); dynamicContext.bind(new QName("doc2"), new StreamSource(dataDir + "/test2.xml")); XPathExecutable executable = factory.prepareXPath("deep-equal($doc1, $doc2)", staticContext); XSequenceCursor result = executable.execute(dynamicContext); if (result.exportAsList().get(0).getBooleanValue()) { System.out.println("deep-equal == true"); } else { System.out.println("deep-equal == false"); } } }
Following are the XML and XML Schema documents used for the above example.
test1.xml
<test>10.00</test>test2.xml
<test>10</test>
test.xsd
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="test" type="double" /> </schema>
For the above examples, if the schema type of element node "test" is xs:double then both the XML documents above are reported deep-equal (since the values 10 and 10.00 are same double values, and the element node was annotated with schema type xs:double and deep-equal function did a type aware comparison of XML documents). But if say the schema type of element node "test" is xs:string, then the XML documents shown above would be reported not deep-equal.
I hope that this post is useful.