Qual è il modo migliore per unire due stringhe XML con gli stessi nomi di tag?

1

Ad esempio, supponiamo di avere due stringhe XML che voglio unire:

<Test>
    <A>false</A>
    <B>true</B>
    <C>Transfers!</C>
</Test>

<Test2>
    <A>false</A>
    <B>false</B>
</Test2>

Dove appare il risultato finale (notare, B è ora falso, perché vorrei che un posto eseguisse una sorta di logica per determinare i "valori uniti" finali, in questo esempio, un metodo prenderebbe in due stringhe, false, e true, e fare un po 'di logica AND e restituire "false")

<Test>
    <A>false</A>
    <B>false</B>
    <C>Transfers!</C>
</Test>

Sto pensando di farlo tutto a mano, usando JAX-B & XPath, o XStream Marshal / Unmarshallers. Qualcuno ha un esempio del migliore & il modo più dinamico per farlo?

I nomi degli elementi cambieranno, non saranno sempre "A" e "B", ma le due stringhe XML che ho inserito avranno sempre alcuni elementi in comune, ma a volte una stringa XML / Il documento può avere uno o più elementi che non esistono nell'altro documento, e in questo caso quelli devono essere nel risultato XML finale così com'è.

    
posta Future Java Sorcerer 10.08.2016 - 21:54
fonte

2 risposte

1

XML e JaxB ti permetteranno di rimuovere unmarshall queste stringhe / documenti xml in oggetti. Dopodiché avresti alimentato questi due oggetti come input per un metodo Merge (thing1, thing2) che restituisce quindi l'oggetto unito. Quindi esegui il marshall in una stringa / documento XML e sei completo.

Per quanto sia "dinamico", non sarebbe prudente. Vorresti definire la logica su come ognuno dei potenziali campi è popolato (supponendo che ci siano campi non booleani).

Nota: il marshal / unmarshal offre l'opportunità di applicare lo schema sui dati forniti. Se analizzi il documento manualmente, sarai obbligato a convalidare la formattazione xml e convalidarla con uno schema, il che non sembra una buona idea, considerando che ci sono librerie là fuori che ogni servizio di soap web sta già utilizzando.

    
risposta data 26.08.2016 - 20:42
fonte
0

Se hai una varietà di esigenze di copia / incolla di parti di messaggi XML, in modo flessibile (specificato nella configurazione), puoi usare XSL Transformations (ammesso che potrebbe essere eccessivo per introdurre XSLT nel tuo progetto per un minimo di requisito ).

Documento XML di input:

<?xml version="1.0" encoding="UTF-8"?>
<Wrapper>
    <Test>
            <title>Empire Burlesque</title>
            <country>USA</country>
    </Test>
    <Test1>
            <title>Hide your heart</title>
            <country>UK</country>
    </Test1>
    <Test2>
            <title>Go to Heaven</title>
            <country>Australia</country>
    </Test2>
    <DefaultTest>
        <title>Default Title</title>
        <country>Default Country</country>
    </DefaultTest>
</Wrapper>

Documento XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/*">
    <xsl:for-each select="*[starts-with(name(),'Test')]">
        <xsl:copy-of select="*"/>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

L'output risultante:

<?xml version="1.0" encoding="UTF-8"?>

<title>Empire Burlesque</title>
<country>USA</country>

<title>Hide your heart</title>
<country>UK</country>

<title>Go to Heaven</title>
<country>Australia</country>
    
risposta data 26.08.2016 - 21:55
fonte

Leggi altre domande sui tag