Java'da 2 XML belgesini karşılaştırmanın en iyi yolu


198

Temelde bir XML iletisine özel bir ileti biçimini çevirir ve diğer ucunu gönderir bir uygulamanın otomatik sınama yazmaya çalışıyorum. Giriş / çıkış mesajı çiftleri iyi bir set var, bu yüzden tek yapmam gereken giriş mesajları göndermek ve diğer ucu çıkıp XML mesajı dinlemek.

Gerçek çıktıyı beklenen çıktıyla karşılaştırmanın zamanı geldiğinde bazı sorunlarla karşılaşıyorum. İlk düşüncem sadece beklenen ve gerçek mesajlar üzerinde dize karşılaştırmaları yapmaktı. Örnek veriler her zaman tutarlı bir şekilde biçimlendirilmediğinden ve XML ad alanı için sıklıkla farklı takma adlar bulunduğundan (ve bazen ad alanları hiç kullanılmadığından) bu pek işe yaramaz.

Ben her iki dizeleri ayrıştırmak ve sonra her bir öğe üzerinden yürümek ve kendim karşılaştırmak biliyorum ve bu yapmak çok zor olmaz, ama ben daha iyi bir yol ya da kaldıraç olabilir bir kütüphane var hissediyorum.

Yani, kaynamış, soru:

Her ikisi de geçerli XML içeren iki Java Dizesi verildiğinde, bunların anlamsal olarak eşdeğer olup olmadığını belirlemeye nasıl devam edersiniz? Farklılıkların ne olduğunu belirlemek için bir yolunuz varsa bonus puanları.

Yanıtlar:


196

XMLUnit için bir iş gibi geliyor

Misal:

public class SomeTest extends XMLTestCase {
  @Test
  public void test() {
    String xml1 = ...
    String xml2 = ...

    XMLUnit.setIgnoreWhitespace(true); // ignore whitespace differences

    // can also compare xml Documents, InputSources, Readers, Diffs
    assertXMLEqual(xml1, xml2);  // assertXMLEquals comes from XMLTestCase
  }
}

1
Geçmişte XMLUNit ile ilgili sorunlar yaşadım, XML API sürümleriyle aşırı sıkışıktı ve güvenilirliği kanıtlanmadı. Yine de XOM için hendelediğimden beri bir süredir, bu yüzden belki o zamandan beri büyümüştür.
skaffman

63
XMLUnit'e yeni başlayanlar için , kontrol ve test belgelerinin girinti / satır satırlarında farklı olması durumunda , myDiff.slike () öğesinin varsayılan olarak false değerini döndüreceğini unutmayın . Bu davranışı myDiff.benical () değil, myDiff.benzer () bekleniyor. XMLUnit.setIgnoreWhitespace (true) öğesini ekleyin; test sınıfınızdaki tüm testlerin davranışını değiştirmek için veya bunu yalnızca o testin davranışını değiştirmek için ayrı bir test yönteminde kullanın.
Güveç

1
@ Yorumunuz için teşekkürler, sadece XMLUnit ile başlıyor ve eminim bu sorunla karşılaşırsınız. +1
Jay

2
Bunu github'daki XMLUnit 2 ile deniyorsanız, 2 sürüm tam bir yeniden yazmadır, bu nedenle bu örnek SourceForge'daki XMLUnit 1 içindir. Ayrıca, sourceforge sayfasında "Java 1.x için XMLUnit korunacak" yazıyor.
Yngvar Kristiansen

1
yöntemi XMLAssert.java ile olduğu gibi assertXMLEqual yöntemidir .
user2818782

36

Aşağıdakiler, belgelerin standart JDK kitaplıklarını kullanarak eşit olup olmadığını kontrol edecektir.

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance ();
dbf.setNamespaceAware (doğru);
dbf.setCoalescing (doğru);
dbf.setIgnoringElementContentWhitespace (doğru);
dbf.setIgnoringComments (doğru);
DocumentBuilder db = dbf.newDocumentBuilder ();

Belge doc1 = db.parse (yeni Dosya ("dosya1.xml"));
doc1.normalizeDocument ();

Belge doc2 = db.parse (yeni Dosya ("dosya2.xml"));
doc2.normalizeDocument ();

Assert.assertTrue (doc1.isEqualNode (doc2));

normalize () hiçbir döngü olmadığından emin olmak için var (teknik olarak hiç olmaz)

Yukarıdaki kod, beyaz boşlukların elemanlar içinde aynı olmasını gerektirir, çünkü onu korur ve değerlendirir. Java ile gelen standart XML ayrıştırıcısı, kanonik bir sürüm sağlamak için bir özellik ayarlamanıza veya xml:spacebunun bir sorun olup olmayacağını anlamanıza izin vermezse, xerces gibi yeni bir XML ayrıştırıcıya ihtiyacınız olabilir veya JDOM'u kullanabilirsiniz.


4
Bu, ad alanları olmayan veya "normalleştirilmiş" ad alanı önekleri olan XML'ler için mükemmel şekilde çalışır. Bir XML ise çalıştığını şüphe <ns1: Bir xmlns: ns1 = "ns" /> ve diğeri <ns2: Bir xmlns: ns2 = "ns" />
koppor

dbf.setIgnoringElementContentWhitespace (true) sonucu yok <root> adı </root> bu çözümle (iki boşlukla doldurulmuş) <root> adı </name> ile eşit değil ama XMLUnit eşit sonuç verir bu durumda (JDK8)
Miklos Krivan

Benim için satır sonlarını görmezden gelmiyor, bu bir problem.
Flyout91

setIgnoringElementContentWhitespace(false)
Archimedes Trajano

28

Xom , DOM'larınızı düzenli bir forma dönüştüren bir Canonicalizer yardımcı programına sahiptir, bu da daha sonra dizgi oluşturabilir ve karşılaştırabilirsiniz. Boşluk düzensizlikleri veya nitelik sıralaması ne olursa olsun, belgelerinizin düzenli ve öngörülebilir karşılaştırmaları alabilirsiniz.

Bu özellikle Eclipse gibi görsel String karşılaştırıcılarına sahip IDE'lerde işe yarar. Belgeler arasındaki anlamsal farklılıkların görsel bir temsilini alırsınız.


21

XMLUnit'in en son sürümü, iki XML eşitleme işinin eşit olmasına yardımcı olabilir. Ayrıca XMLUnit.setIgnoreWhitespace()ve XMLUnit.setIgnoreAttributeOrder()söz konusu dava için gerekli olabilir.

Aşağıdaki XML Birimi kullanımının basit bir örneğinin çalışma koduna bakın.

import org.custommonkey.xmlunit.DetailedDiff;
import org.custommonkey.xmlunit.XMLUnit;
import org.junit.Assert;

public class TestXml {

    public static void main(String[] args) throws Exception {
        String result = "<abc             attr=\"value1\"                title=\"something\">            </abc>";
        // will be ok
        assertXMLEquals("<abc attr=\"value1\" title=\"something\"></abc>", result);
    }

    public static void assertXMLEquals(String expectedXML, String actualXML) throws Exception {
        XMLUnit.setIgnoreWhitespace(true);
        XMLUnit.setIgnoreAttributeOrder(true);

        DetailedDiff diff = new DetailedDiff(XMLUnit.compareXML(expectedXML, actualXML));

        List<?> allDifferences = diff.getAllDifferences();
        Assert.assertEquals("Differences found: "+ diff.toString(), 0, allDifferences.size());
    }

}

Maven kullanıyorsanız bunu aşağıdakilere ekleyin pom.xml:

<dependency>
    <groupId>xmlunit</groupId>
    <artifactId>xmlunit</artifactId>
    <version>1.4</version>
</dependency>

Bu, statik bir yöntemle karşılaştırılması gereken kişiler için mükemmeldir.
Andy B

Bu mükemmel bir cevap. Teşekkür ederim .. Ancak var olmayan düğümleri görmezden gelmem gerekiyor. Sonuç çıktıda böyle bir çıktı görmek istemiyorum çünkü: Çocuk düğümü "null" beklenen varlığı ama oldu ...... Bunu nasıl yapabilirim? Saygılarımızla. @acdcjunior
limonik

1
XMLUnit.setIgnoreAttributeOrder (doğru); çalışmıyor. Bazı düğümlerin farklı bir sırası varsa, karşılaştırma başarısız olur.
Bevor

[GÜNCELLEME] bu çözüm işe yarıyor: stackoverflow.com/questions/33695041/…
Bevor

"IgnoreAttributeOrder", öznitelik sırasını yoksay ve düğüm sırasını yoksay anlamına gelir, değil mi?
acdcjunior

7

Teşekkürler, bunu uzattım, şunu dene ...

import java.io.ByteArrayInputStream;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

public class XmlDiff 
{
    private boolean nodeTypeDiff = true;
    private boolean nodeValueDiff = true;

    public boolean diff( String xml1, String xml2, List<String> diffs ) throws Exception
    {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        dbf.setCoalescing(true);
        dbf.setIgnoringElementContentWhitespace(true);
        dbf.setIgnoringComments(true);
        DocumentBuilder db = dbf.newDocumentBuilder();


        Document doc1 = db.parse(new ByteArrayInputStream(xml1.getBytes()));
        Document doc2 = db.parse(new ByteArrayInputStream(xml2.getBytes()));

        doc1.normalizeDocument();
        doc2.normalizeDocument();

        return diff( doc1, doc2, diffs );

    }

    /**
     * Diff 2 nodes and put the diffs in the list 
     */
    public boolean diff( Node node1, Node node2, List<String> diffs ) throws Exception
    {
        if( diffNodeExists( node1, node2, diffs ) )
        {
            return true;
        }

        if( nodeTypeDiff )
        {
            diffNodeType(node1, node2, diffs );
        }

        if( nodeValueDiff )
        {
            diffNodeValue(node1, node2, diffs );
        }


        System.out.println(node1.getNodeName() + "/" + node2.getNodeName());

        diffAttributes( node1, node2, diffs );
        diffNodes( node1, node2, diffs );

        return diffs.size() > 0;
    }

    /**
     * Diff the nodes
     */
    public boolean diffNodes( Node node1, Node node2, List<String> diffs ) throws Exception
    {
        //Sort by Name
        Map<String,Node> children1 = new LinkedHashMap<String,Node>();      
        for( Node child1 = node1.getFirstChild(); child1 != null; child1 = child1.getNextSibling() )
        {
            children1.put( child1.getNodeName(), child1 );
        }

        //Sort by Name
        Map<String,Node> children2 = new LinkedHashMap<String,Node>();      
        for( Node child2 = node2.getFirstChild(); child2!= null; child2 = child2.getNextSibling() )
        {
            children2.put( child2.getNodeName(), child2 );
        }

        //Diff all the children1
        for( Node child1 : children1.values() )
        {
            Node child2 = children2.remove( child1.getNodeName() );
            diff( child1, child2, diffs );
        }

        //Diff all the children2 left over
        for( Node child2 : children2.values() )
        {
            Node child1 = children1.get( child2.getNodeName() );
            diff( child1, child2, diffs );
        }

        return diffs.size() > 0;
    }


    /**
     * Diff the nodes
     */
    public boolean diffAttributes( Node node1, Node node2, List<String> diffs ) throws Exception
    {        
        //Sort by Name
        NamedNodeMap nodeMap1 = node1.getAttributes();
        Map<String,Node> attributes1 = new LinkedHashMap<String,Node>();        
        for( int index = 0; nodeMap1 != null && index < nodeMap1.getLength(); index++ )
        {
            attributes1.put( nodeMap1.item(index).getNodeName(), nodeMap1.item(index) );
        }

        //Sort by Name
        NamedNodeMap nodeMap2 = node2.getAttributes();
        Map<String,Node> attributes2 = new LinkedHashMap<String,Node>();        
        for( int index = 0; nodeMap2 != null && index < nodeMap2.getLength(); index++ )
        {
            attributes2.put( nodeMap2.item(index).getNodeName(), nodeMap2.item(index) );

        }

        //Diff all the attributes1
        for( Node attribute1 : attributes1.values() )
        {
            Node attribute2 = attributes2.remove( attribute1.getNodeName() );
            diff( attribute1, attribute2, diffs );
        }

        //Diff all the attributes2 left over
        for( Node attribute2 : attributes2.values() )
        {
            Node attribute1 = attributes1.get( attribute2.getNodeName() );
            diff( attribute1, attribute2, diffs );
        }

        return diffs.size() > 0;
    }
    /**
     * Check that the nodes exist
     */
    public boolean diffNodeExists( Node node1, Node node2, List<String> diffs ) throws Exception
    {
        if( node1 == null && node2 == null )
        {
            diffs.add( getPath(node2) + ":node " + node1 + "!=" + node2 + "\n" );
            return true;
        }

        if( node1 == null && node2 != null )
        {
            diffs.add( getPath(node2) + ":node " + node1 + "!=" + node2.getNodeName() );
            return true;
        }

        if( node1 != null && node2 == null )
        {
            diffs.add( getPath(node1) + ":node " + node1.getNodeName() + "!=" + node2 );
            return true;
        }

        return false;
    }

    /**
     * Diff the Node Type
     */
    public boolean diffNodeType( Node node1, Node node2, List<String> diffs ) throws Exception
    {       
        if( node1.getNodeType() != node2.getNodeType() ) 
        {
            diffs.add( getPath(node1) + ":type " + node1.getNodeType() + "!=" + node2.getNodeType() );
            return true;
        }

        return false;
    }

    /**
     * Diff the Node Value
     */
    public boolean diffNodeValue( Node node1, Node node2, List<String> diffs ) throws Exception
    {       
        if( node1.getNodeValue() == null && node2.getNodeValue() == null )
        {
            return false;
        }

        if( node1.getNodeValue() == null && node2.getNodeValue() != null )
        {
            diffs.add( getPath(node1) + ":type " + node1 + "!=" + node2.getNodeValue() );
            return true;
        }

        if( node1.getNodeValue() != null && node2.getNodeValue() == null )
        {
            diffs.add( getPath(node1) + ":type " + node1.getNodeValue() + "!=" + node2 );
            return true;
        }

        if( !node1.getNodeValue().equals( node2.getNodeValue() ) )
        {
            diffs.add( getPath(node1) + ":type " + node1.getNodeValue() + "!=" + node2.getNodeValue() );
            return true;
        }

        return false;
    }


    /**
     * Get the node path
     */
    public String getPath( Node node )
    {
        StringBuilder path = new StringBuilder();

        do
        {           
            path.insert(0, node.getNodeName() );
            path.insert( 0, "/" );
        }
        while( ( node = node.getParentNode() ) != null );

        return path.toString();
    }
}

3
Oldukça geç, ama sadece bu kod parçasının bir hata olduğunu not etmek istedim: diffNodes () 'da, node2 referansı yoktur - ikinci döngü node1'i yanlış olarak yeniden kullanır (bunu düzeltmek için kodu düzenledim). Ayrıca, 1 sınırlaması vardır: Alt eşlemeler yolunun anahtarlanması nedeniyle, bu fark öğe adlarının benzersiz olmadığı durumu, yani tekrarlanabilir alt öğeler içeren öğeleri desteklemez.
aberrant80

7

Tom'un cevabına dayanarak , XMLUnit v2 kullanan bir örnek.

Bu maven bağımlılıklarını kullanır

    <dependency>
        <groupId>org.xmlunit</groupId>
        <artifactId>xmlunit-core</artifactId>
        <version>2.0.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.xmlunit</groupId>
        <artifactId>xmlunit-matchers</artifactId>
        <version>2.0.0</version>
        <scope>test</scope>
    </dependency>

..ve işte test kodu

import static org.junit.Assert.assertThat;
import static org.xmlunit.matchers.CompareMatcher.isIdenticalTo;
import org.xmlunit.builder.Input;
import org.xmlunit.input.WhitespaceStrippedSource;

public class SomeTest extends XMLTestCase {
    @Test
    public void test() {
        String result = "<root></root>";
        String expected = "<root>  </root>";

        // ignore whitespace differences
        // https://github.com/xmlunit/user-guide/wiki/Providing-Input-to-XMLUnit#whitespacestrippedsource
        assertThat(result, isIdenticalTo(new WhitespaceStrippedSource(Input.from(expected).build())));

        assertThat(result, isIdenticalTo(Input.from(expected).build())); // will fail due to whitespace differences
    }
}

Bunu özetleyen belgeler https://github.com/xmlunit/xmlunit#comparing-two-documents


4

AssertJ 1.4+, XML içeriğini karşılaştırmak için özel iddialara sahiptir:

String expectedXml = "<foo />";
String actualXml = "<bar />";
assertThat(actualXml).isXmlEqualTo(expectedXml);

İşte Belgeler


3

skaffman iyi bir cevap veriyor gibi görünüyor.

başka bir yol, muhtemelen xmlstarlet ( http://xmlstar.sourceforge.net/ ) gibi bir commmand line yardımcı programını kullanarak XML'yi biçimlendirmek ve ardından her iki dizeyi biçimlendirmek ve sonra ortaya çıkan çıktı dosyalarını dağıtmak için herhangi bir diff yardımcı programını (kitaplığı) kullanmaktır. Ad alanlarıyla ilgili sorunlar olduğunda bunun iyi bir çözüm olup olmadığını bilmiyorum.


2

Yapısal olarak XML dosyalarını karşılaştırmak için seçenekler vardır (dize verileri yok sayılıyor) Altova DiffDog kullanıyorum .

Bu şu anlama gelir ('metni yoksay' seçeneğini işaretlerseniz):

<foo a="xxx" b="xxx">xxx</foo>

ve

<foo b="yyy" a="yyy">yyy</foo> 

yapısal eşitliğe sahip olmaları bakımından eşittir. Verilerde farklılık gösteren, ancak yapıda olmayan örnek dosyalarınız varsa bu kullanışlıdır!


3
Sadece eksi, 30 günlük deneme süresiyle ücretsiz değil (profesyonel lisans için 99 €).
Pimin Konstantin Kefaloukos

2
Yalnızca yardımcı programı buldum ( altova.com/diffdog/diff-merge-tool.html ); kütüphane olması güzel.
dma_k

1

Bu, tam dize XML'lerini karşılaştırır (yolda yeniden biçimlendirir). XML dosyalarındaki farkı tıklamanız ve görsel olarak görmeniz nedeniyle IDE'nizle (IntelliJ, Eclipse) çalışmanızı kolaylaştırır.

import org.apache.xml.security.c14n.CanonicalizationException;
import org.apache.xml.security.c14n.Canonicalizer;
import org.apache.xml.security.c14n.InvalidCanonicalizerException;
import org.w3c.dom.Element;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSSerializer;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import java.io.IOException;
import java.io.StringReader;

import static org.apache.xml.security.Init.init;
import static org.junit.Assert.assertEquals;

public class XmlUtils {
    static {
        init();
    }

    public static String toCanonicalXml(String xml) throws InvalidCanonicalizerException, ParserConfigurationException, SAXException, CanonicalizationException, IOException {
        Canonicalizer canon = Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS);
        byte canonXmlBytes[] = canon.canonicalize(xml.getBytes());
        return new String(canonXmlBytes);
    }

    public static String prettyFormat(String input) throws TransformerException, ParserConfigurationException, IOException, SAXException, InstantiationException, IllegalAccessException, ClassNotFoundException {
        InputSource src = new InputSource(new StringReader(input));
        Element document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(src).getDocumentElement();
        Boolean keepDeclaration = input.startsWith("<?xml");
        DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
        DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
        LSSerializer writer = impl.createLSSerializer();
        writer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);
        writer.getDomConfig().setParameter("xml-declaration", keepDeclaration);
        return writer.writeToString(document);
    }

    public static void assertXMLEqual(String expected, String actual) throws ParserConfigurationException, IOException, SAXException, CanonicalizationException, InvalidCanonicalizerException, TransformerException, IllegalAccessException, ClassNotFoundException, InstantiationException {
        String canonicalExpected = prettyFormat(toCanonicalXml(expected));
        String canonicalActual = prettyFormat(toCanonicalXml(actual));
        assertEquals(canonicalExpected, canonicalActual);
    }
}

İstemci kodu (test kodu) daha temiz olduğu için bunu XmlUnit'e tercih ederim.


1
Bu aynı XML ve farklı XML ile, şimdi yaptığım iki testte iyi çalışıyor. IntelliJ fark ile karşılaştırılan XML farklılıkları tespit etmek kolaydır.
Yngvar Kristiansen

1
Bu arada, Maven kullanıyorsanız bu bağımlılığa ihtiyacınız olacak: <bağımlılık> <grupKimliği> org.apache.santuario </groupId> <artifactId> xmlsec </artifactId> <sürüm> 2.0.6 </version> </ bağımlılık>
Yngvar Kristiansen

1

Aşağıdaki kod benim için çalışıyor

String xml1 = ...
String xml2 = ...
XMLUnit.setIgnoreWhitespace(true);
XMLUnit.setIgnoreAttributeOrder(true);
XMLAssert.assertXMLEqual(actualxml, xmlInDb);

1
Herhangi bir bağlam? Kütüphane referansı?
Ben

0

Java uygulaması ile JExamXML kullanma

    import com.a7soft.examxml.ExamXML;
    import com.a7soft.examxml.Options;

       .................

       // Reads two XML files into two strings
       String s1 = readFile("orders1.xml");
       String s2 = readFile("orders.xml");

       // Loads options saved in a property file
       Options.loadOptions("options");

       // Compares two Strings representing XML entities
       System.out.println( ExamXML.compareXMLString( s1, s2 ) );

0

Ana soruda istenen işlevsellik gerekiyordu. Herhangi bir 3. taraf kütüphanesi kullanmama izin verilmediğinden, @Archimedes Trajano çözümüne dayanan kendi çözümümü yarattım.

İşte benim çözümüm.

import java.io.ByteArrayInputStream;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.junit.Assert;
import org.w3c.dom.Document;

/**
 * Asserts for asserting XML strings.
 */
public final class AssertXml {

    private AssertXml() {
    }

    private static Pattern NAMESPACE_PATTERN = Pattern.compile("xmlns:(ns\\d+)=\"(.*?)\"");

    /**
     * Asserts that two XML are of identical content (namespace aliases are ignored).
     * 
     * @param expectedXml expected XML
     * @param actualXml actual XML
     * @throws Exception thrown if XML parsing fails
     */
    public static void assertEqualXmls(String expectedXml, String actualXml) throws Exception {
        // Find all namespace mappings
        Map<String, String> fullnamespace2newAlias = new HashMap<String, String>();
        generateNewAliasesForNamespacesFromXml(expectedXml, fullnamespace2newAlias);
        generateNewAliasesForNamespacesFromXml(actualXml, fullnamespace2newAlias);

        for (Entry<String, String> entry : fullnamespace2newAlias.entrySet()) {
            String newAlias = entry.getValue();
            String namespace = entry.getKey();
            Pattern nsReplacePattern = Pattern.compile("xmlns:(ns\\d+)=\"" + namespace + "\"");
            expectedXml = transletaNamespaceAliasesToNewAlias(expectedXml, newAlias, nsReplacePattern);
            actualXml = transletaNamespaceAliasesToNewAlias(actualXml, newAlias, nsReplacePattern);
        }

        // nomralize namespaces accoring to given mapping

        DocumentBuilder db = initDocumentParserFactory();

        Document expectedDocuemnt = db.parse(new ByteArrayInputStream(expectedXml.getBytes(Charset.forName("UTF-8"))));
        expectedDocuemnt.normalizeDocument();

        Document actualDocument = db.parse(new ByteArrayInputStream(actualXml.getBytes(Charset.forName("UTF-8"))));
        actualDocument.normalizeDocument();

        if (!expectedDocuemnt.isEqualNode(actualDocument)) {
            Assert.assertEquals(expectedXml, actualXml); //just to better visualize the diffeences i.e. in eclipse
        }
    }


    private static DocumentBuilder initDocumentParserFactory() throws ParserConfigurationException {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(false);
        dbf.setCoalescing(true);
        dbf.setIgnoringElementContentWhitespace(true);
        dbf.setIgnoringComments(true);
        DocumentBuilder db = dbf.newDocumentBuilder();
        return db;
    }

    private static String transletaNamespaceAliasesToNewAlias(String xml, String newAlias, Pattern namespacePattern) {
        Matcher nsMatcherExp = namespacePattern.matcher(xml);
        if (nsMatcherExp.find()) {
            xml = xml.replaceAll(nsMatcherExp.group(1) + "[:]", newAlias + ":");
            xml = xml.replaceAll(nsMatcherExp.group(1) + "=", newAlias + "=");
        }
        return xml;
    }

    private static void generateNewAliasesForNamespacesFromXml(String xml, Map<String, String> fullnamespace2newAlias) {
        Matcher nsMatcher = NAMESPACE_PATTERN.matcher(xml);
        while (nsMatcher.find()) {
            if (!fullnamespace2newAlias.containsKey(nsMatcher.group(2))) {
                fullnamespace2newAlias.put(nsMatcher.group(2), "nsTr" + (fullnamespace2newAlias.size() + 1));
            }
        }
    }

}

İki XML dizesini karşılaştırır ve her iki giriş dizesindeki benzersiz değerlere çevirerek uyumsuz ad alanı eşlemelerini halleder.

İsim alanlarının çevrilmesi durumunda ince ayar yapılabilir. Ama benim gereksinimlerim için sadece iş yapar.


-2

"Anlamsal olarak eşdeğer" dediğinizden, xml çıktılarının (dize) eşit olduğunu ve bunun gibi bir şey istediğinizi doğrulamaktan daha fazlasını yapmak istediğinizi varsayalım.

<foo> burada bazı şeyler </foo> </code>

ve

<foo> burada bazı şeyler </foo> </code>

eşdeğeri olarak okuyun. Sonuçta, mesajı yeniden oluşturduğunuz herhangi bir nesne için "anlamsal olarak eşdeğer" i nasıl tanımladığınız önemli olacaktır. Bu nesneyi mesajlardan oluşturun ve aradığınızı tanımlamak için özel bir equals () kullanın.


4
Bir cevap değil, bir soru.
Kartoch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.