2016-05-09 16 views
-1

Ich bin ziemlich neu Regex, aber ich versuche es zu lernen. Ich bin nichts zu tun kompliziert ich einige XML haben:Erhalten Wert der Zeichenfolge zwischen zwei Tags

<root> 
    <friendlyName>Hello, I'm friendly</friendlyName> 
    <URL>http://localhost</URL> 
</root> 

Ich versuche, den Wert von friendly zu bekommen, aber es scheint nicht zu funktionieren. Ich habe einen Online-Regex-Tester von https://regex101.com/ verwendet, der mit dem übereinstimmt, was ich erwarte. Jedoch, wenn ich es in Java versuche, bekomme ich N/A, N/A zurück, was ich zurückgebe, wenn die Schnur nicht gefunden wurde.

Unten ist mein Code:

public String getXMLTagValue(String tagName) 
    { 
     Pattern pattern = Pattern.compile("<" + tagName + ">(.*?)</" + tagName + ">/s"); 
     Matcher matcher = pattern.matcher(xmlString); 
     while (matcher.find()) 
     { 
      return matcher.group(); 
     } 
     return "N/A"; 
    } 

ich den obigen Code erwartet Hello, I'm friendly zurückzukehren, sondern ich N/A bekommen.

Vielen Dank für Ihre Hilfe.

+9

Verwenden Sie keine regulären Ausdrücke zum Parsen von XML. Verwenden Sie einen XML-Parser. Es spielt keine Rolle, wie einfach das XML ist. –

+0

Was ist das '/ s', das am Ende der' Pattern'-Saite stehen soll? –

+0

Ihr XML ist nicht gut gebildet '' endet mit '' – Sanjeev

Antwort

0

Sie regex ist falsch definiert, muss es sein:

"<" + tagName + ">(.*?)</" + tagName + ">\\s" 

und nicht

"<" + tagName + ">(.*?)</" + tagName + ">/s" 
+0

Freundlich war ein Tippfehler, es sollte am Ende auch friendlyName sein. Ich glaube/s sollte auch Zeilenenden enthalten, die ich brauche – Boardy

+0

danke ... Ich werde die Antwort aktualisieren –

0

ändern

"<" + tagName + ">(.*?)</" + tagName + ">/s" 

zu

"<" + tagName + ">(.*?)</" + tagName + ">\\s" 

Grund:

Das \ s Metazeichen wird verwendet, um ein Leerzeichen zu finden.
A können Leerzeichen sein:
ein Leerzeichen
Tabulatorzeichen
Ein Wagenrücklaufzeichen
ein Zeilenvorschubzeichen
Eine vertikale Tabulatorzeichen
A Formularvorschub Zeichen

So Die wahre Form ist \s, die, wenn sie zu Java Regex kommt, wird \\s (Weil \ ist ein Sonderzeichen in Java)


Auch ich (und einige andere) denken, dass \\s verwendet, ist nicht erforderlich. Sie können nur dieses Muster verwenden:

"<" + tagName + ">(.*?)</" + tagName + ">" 
+0

Warum sollten sie das tun? –

+0

@SotiriosDelimanolis Redigiert meine Antwort zu klären. –

+0

Noch scheint es in ihrem Code unnötig. –

0

starten Korrektur Ihrer XML <friendlyName> ends with </friendly>, ist es nicht gut ausgebildet. Dann regex falsch ist, können Sie ersetzen:

"<" + tagName + ">(.*?)</" + tagName + ">/s" 

mit:

"<" + tagName + ">(.*?)</" + tagName + ">\\s" 

aber wirklich brauchen Sie nicht die "\\ s".

Wenn Sie nur den Text zwischen den Tags möchten, müssen Sie auch das Öffnen- und Schließen-Tag entfernen, bevor Sie die Ergebniszeichenfolge zurückgeben. Unten ist der Arbeitscode, ich fügte auch eine verbesserte Methode die Verwendung der javax.xml.parsers.DocumentBuilder zum Parsen der XML anstelle von Regex.

private static String xmlString = 
          "<root>" 
          +"<friendly>Hello, I'm friendly</friendly>" 
          +"<url>http://localhost</url>" 
          +"</root>"; 

public static void main(String[] args) throws Exception { 

    String value = getXMLTagValue("friendly"); 
    System.out.println(value); 

    String out = getXMLTagValueImproved("friendly"); 
    System.out.println(out); 

} 

public static String getXMLTagValue(String tagName) 
{ 
    String openTag = "<" + tagName + ">"; 
    String closeTag = "</" + tagName + ">"; 
    Pattern pattern = Pattern.compile(openTag + "(.*?)" + closeTag); 
    Matcher matcher = pattern.matcher(xmlString); 
    while (matcher.find()) 
    { 
     return matcher.group().replaceAll(openTag, "").replace(closeTag, ""); 
    } 
    return "N/A"; 
} 

public static String getXMLTagValueImproved(String tagName) throws Exception { 

    InputSource is = new InputSource(new StringReader(xmlString)); 
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();; 
    Document doc = dBuilder.parse(is);  
    NodeList nl = doc.getDocumentElement().getElementsByTagName(tagName); 
    return nl.getLength() > 0 ? nl.item(0).getTextContent() : "N/A" ; 
} 

hoffe das kann helfen.

Verwandte Themen