2008-09-18 7 views

Antwort

2

Einige der Sachen, die Sie mit einem XSLT tun können, können Sie auch mit einer Form von "Suche & ersetzen" tun. Es hängt alles davon ab, wie komplex Ihr Problem ist und wie "generisch" Sie die Lösung implementieren möchten. Um Ihr eigenes Beispiel ein wenig generischer zu machen:

xml.replaceFirst("<Mobiltlf>[^<]*</Mobiltlf>", '<Mobiltlf>32165487</Mobiltlf>') 

Die Lösung, die Sie wählen, liegt bei Ihnen. Nach meiner Erfahrung (für sehr einfache Probleme) ist die Verwendung einfacher String-Lookups schneller als die Verwendung regulärer Ausdrücke, was wiederum schneller ist als die Verwendung einer vollständigen XSLT-Transformation (macht eigentlich Sinn).

1

Nach einiger rasenden Codierung ich das Licht sah und tat wie diese

import org.custommonkey.xmlunit.Diff 
import org.custommonkey.xmlunit.XMLUnit 

def input = '''<root><data></data></root>''' 
def expectedResult = '''<root><data>value</data></root>''' 

def xml = new XmlParser().parseText(input) 

def p = xml.'**'.data 
p.each{it.value="value"} 

def writer = new StringWriter() 
new XmlNodePrinter(new PrintWriter(writer)).print(xml) 
def result = writer.toString() 

XMLUnit.setIgnoreWhitespace(true) 
def xmlDiff = new Diff(result, expectedResult) 
assert xmlDiff.identical() 

Leider wird dies nicht die Kommentare bewahren und Metadaten usw., von der ursprünglichen XML-Dokument, also werde ich eine andere Art und Weise

0

Three „offizielle“ groovy Wege der Aktualisierung XML beschrieben auf Seite http://groovy.codehaus.org/Processing+XML finden müssen , Abschnitt "Aktualisieren von XML".

Davon drei nur DOMCategory Weg scheint bewahrt XML-Kommentare usw.

1

ich einige mit DOMCategory einige Tests gemacht und es funktioniert fast. Ich kann die Ersetzung herbeiführen, aber einige infopathische Kommentare verschwinden. Ich verwende ein Verfahren wie folgt aus:

def rtv = { xml, tag, value -> 
    def doc  = DOMBuilder.parse(new StringReader(xml)) 
    def root = doc.documentElement 
    use(DOMCategory) { root.'**'."$tag".each{it.value=value} } 
    return DOMUtil.serialize(root)  
} 

auf einer Quelle wie folgt aus:

<?xml version="1.0" encoding="utf-8"?> 
<?mso-infoPathSolution name="urn:schemas-microsoft-com:office:infopath:FA_Ansoegning:http---ementor-dk-application-2007-06-22-" href="manifest.xsf" solutionVersion="1.0.0.14" productVersion="12.0.0" PIVersion="1.0.0.0" ?> 
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?> 
<application:FA_Ansoegning xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:application="http://corp.dk/application/2007/06/22/" 
xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" 
xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/200 8-04-14T14:31:48"> 
    <Mobiltlf></Mobiltlf> 
    <E-mail-adresse></E-mail-adresse> 
</application:FA_Ansoegning> 

Das einzige, was aus dem Ergebnis fehlt, sind die < mso- Zeilen aus dem Ergebnis?. Wer hat eine Idee dafür?

0

Für mich die tatsächliche Kopie & Suche & ersetzen scheint wie der perfekte Job für ein XSLT Stylesheet. In einem XSLT haben Sie kein Problem, nur alles zu kopieren (einschließlich der Elemente, mit denen Sie Probleme haben) und einfach Ihre Daten dort einzufügen, wo sie benötigt werden. Sie können den spezifischen Wert Ihrer Daten über einen XSL-Parameter übergeben oder Sie können das Stylesheet selbst dynamisch ändern (wenn Sie es als String in Ihr Groovy-Programm aufnehmen). Der Aufruf dieses XSLT, um Ihre Dokumente aus Groovy zu transformieren, ist sehr einfach.

ich folgende Groovy Skript schnell zusammengeschustert (aber ich habe keine Zweifel, es noch einfacher/kompakt geschrieben werden kann):

import javax.xml.transform.TransformerFactory 
import javax.xml.transform.stream.StreamResult 
import javax.xml.transform.stream.StreamSource 

def xml = """ 
<?xml version="1.0" encoding="utf-8"?> 
<?mso-infoPathSolution name="urn:schemas-microsoft-com:office:infopath:FA_Ansoegning:http---ementor-dk-application-2007-06-22-" href="manifest.xsf" solutionVersion="1.0.0.14" productVersion="12.0.0" PIVersion="1.0.0.0" ?> 
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?> 
<application:FA_Ansoegning xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:application="http://ementor.dk/application/2007/06/22/" 
xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" 
xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/200 8-04-14T14:31:48"> 
    <Mobiltlf></Mobiltlf> 
    <E-mail-adresse></E-mail-adresse> 
</application:FA_Ansoegning> 
""".trim() 

def xslt = """ 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:param name="mobil" select="'***dummy***'"/> 
    <xsl:param name="email" select="'***dummy***'"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Mobiltlf"> 
     <xsl:copy> 
      <xsl:value-of select="\$mobil"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="E-mail-adresse"> 
     <xsl:copy> 
      <xsl:value-of select="\$email"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
""".trim() 

def factory = TransformerFactory.newInstance() 
def transformer = factory.newTransformer(new StreamSource(new StringReader(xslt))) 

transformer.setParameter('mobil', '1234567890') 
transformer.setParameter('email', '[email protected]') 

transformer.transform(new StreamSource(new StringReader(xml)), new StreamResult(System.out)) 

dieses Skript Laufen erzeugt:

<?xml version="1.0" encoding="UTF-8"?><?mso-infoPathSolution name="urn:schemas-microsoft-com:office:infopath:FA_Ansoegning:http---ementor-dk-application-2007-06-22-" href="manifest.xsf" solutionVersion="1.0.0.14" productVersion="12.0.0" PIVersion="1.0.0.0" ?> 
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?> 
<application:FA_Ansoegning xmlns:application="http://ementor.dk/application/2007/06/22/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/200 8-04-14T14:31:48"> 
    <Mobiltlf>1234567890</Mobiltlf> 
    <E-mail-adresse>[email protected]</E-mail-adresse> 
</application:FA_Ansoegning> 
1

Das ist die Beste Antwort bisher und es gibt das richtige Ergebnis, so werde ich die Antwort akzeptieren :) Allerdings ist es ein bisschen zu groß für mich. Ich glaube, ich habe besser zu erklären, dass die Alternative ist:

xml.replace("<Mobiltlf></Mobiltlf>", <Mobiltlf>32165487</Mobiltlf>") 

Aber das ist nicht sehr xml'y so dachte ich, ich nach einer Alternative aussehen würde. Außerdem kann ich nicht sicher sein, dass das erste Tag die ganze Zeit leer ist.

0

Brilliant! Vielen Dank für Ihre Hilfe :)

Das löst mein Problem auf eine viel sauberere und einfachere Weise. Es endete wie folgt aussehen:

def rtv = { xmlSource, tagName, newValue -> 
    regex = "<$tagName>[^<]*</$tagName>" 
    replacement = "<$tagName>${newValue}</$tagName>" 
    xmlSource = xmlSource.replaceAll(regex, replacement) 
    return xmlSource 
} 

input = rtv(input, "Mobiltlf", "32165487") 
input = rtv(input, "E-mail-adresse", "[email protected]") 
println input 

Da ich dies unseren Testern für den Einsatz in ihren Test-Tool SoapUI gebe, habe ich versucht, „wrap“ es, um es einfacher für sie zu kopieren und Einfügen.

Das ist gut genug für meine Zwecke, aber es wäre perfekt, wenn wir noch einen „Twist“

Lassen Sie uns die Eingabe dieses drin ...

<Mobiltlf type="national" anotherattribute="value"></Mobiltlf> 

hatte sagen könnte hinzufügen .. .und wir wollten diese beiden Attribute behalten, obwohl wir den Wert ersetzten. Gibt es eine Möglichkeit, regexp auch dafür zu verwenden?

1

Um die Attribute nur ändern Sie Ihre kleines Programm wie folgt zu behalten (ich habe eine Probenquelle enthalten, es zu testen):

def input = """ 
<?xml version="1.0" encoding="utf-8"?> 
<?mso-infoPathSolution name="urn:schemas-microsoft-com:office:infopath:FA_Ansoegning:http---ementor-dk-application-2007-06-22-" href="manifest.xsf" solutionVersion="1.0.0.14" productVersion="12.0.0" PIVersion="1.0.0.0" ?> 
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?> 
<application:FA_Ansoegning xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:application="http://ementor.dk/application/2007/06/22/" 
xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" 
xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/200 8-04-14T14:31:48"> 
    <Mobiltlf type="national" anotherattribute="value"></Mobiltlf> 
    <E-mail-adresse attr="whatever"></E-mail-adresse> 
</application:FA_Ansoegning> 
""".trim() 

def rtv = { xmlSource, tagName, newValue -> 
    regex = "(<$tagName[^>]*>)([^<]*)(</$tagName>)" 
    replacement = "\$1${newValue}\$3" 
    xmlSource = xmlSource.replaceAll(regex, replacement) 
    return xmlSource 
} 

input = rtv(input, "Mobiltlf", "32165487") 
input = rtv(input, "E-mail-adresse", "[email protected]") 
println input 

dieses Skript Laufen erzeugt:

<?xml version="1.0" encoding="utf-8"?> 
<?mso-infoPathSolution name="urn:schemas-microsoft-com:office:infopath:FA_Ansoegning:http---ementor-dk-application-2007-06-22-" href="manifest.xsf" solutionVersion="1.0.0.14" productVersion="12.0.0" PIVersion="1.0.0.0" ?> 
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?> 
<application:FA_Ansoegning xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:application="http://ementor.dk/application/2007/06/22/" 
xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" 
xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/200 8-04-14T14:31:48"> 
    <Mobiltlf type="national" anotherattribute="value">32165487</Mobiltlf> 
    <E-mail-adresse attr="whatever">[email protected]</E-mail-adresse> 
</application:FA_Ansoegning> 

Beachten Sie, dass die passender regexp enthält jetzt 3 einfangende Gruppen: (1) das Start-Tag (einschließlich der Attribute), (2) was immer der "alte" Inhalt Ihres Tags ist und (3) das End-Tag. Die Ersetzungszeichenfolge bezieht sich auf diese erfassten Gruppen über die $ i-Syntax (mit umgekehrten Schrägstrichen, um sie im GString zu umgehen). Nur ein Tipp: Reguläre Ausdrücke sind sehr mächtige Tiere, es lohnt sich, sich mit ihnen vertraut zu machen ;-).

Verwandte Themen