[REGEX] Declaration und Doctype XML?

Romsl

Erfahrenes Mitglied
Hi,

bin auf der Suche nach einem vollkommen korrekten REGEX für die XML Declaration und den Doctype.

Was ich habe ist

Declaration

Code:
Pattern.compile("(\\s|.)*<\\?.*version=[\"'](.*?)[\"'].*(encoding=[\"'](.*?)[\"'])?.*\\?>")

Doctype

Code:
Pattern.compile("(\\s|.)*<!DOCTYPE\\s(.*?)\\s(SYSTEM((\\s|\\n)\"(.*)\")?|(.*PUBLIC(\\s|\\n)*\".*\"))(\\s|\\n)*\".*\\.dtd\">");


Gibt es eine andere Möglichkeit die Declaration und den Doctype aus einem XML File zu extrahieren? Es sollte alles über einen BufferedReader laufen, da der Rest später noch zerstückelt wird.

Komischerweise hängt er sich in dieser Methode am match auf. Warum kann ich nicht sagen. Möglicherweise weiß jemand warum.

Code:
private char[] extractDoctype() {

        // TODO: prepare this regex for new line doctypes

        StringBuffer doctype = new StringBuffer();

        Pattern doctypePattern = Pattern.compile("(\\s|.)*<!DOCTYPE\\s(.*?)\\s(SYSTEM((\\s|\\n)\"(.*)\")?|(.*PUBLIC(\\s|\\n)*\".*\"))(\\s|\\n)*\".*\\.dtd\">");
        Pattern commentPattern = Pattern.compile("(\\s|.)*<!--(.*)-->");

        while (!doctypePattern.matcher(doctype).matches()) {

            char c;
            for (c = nextChar(); c != '>'; c = nextChar()) {
                doctype.append(c);
            }
            doctype.append(c);

            if (commentPattern.matcher(doctype).matches()) {
                doctype = new StringBuffer();
            }
        }

        if (LOG.isDebugEnabled()) {
            LOG.debug("The doctype of the xml document: \"" + doctype.toString().trim() + "\"");
        }

        return doctype.toString().toCharArray();
    }

Gruß

Romsl
 
Hallo!

Die XML Declaration muß bei wohlgeformten Dokumenten ganz am Anfang stehen. Die DTD Definition kommt direkt danach...

Code:
 /**
  * 
  */
 package de.tutorials;
 
 /**
  * @author Tom
  * 
  */
 public class SimpleXMLExample {
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) throws Exception {
 		String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
 		    	+ "<!DOCTYPE beans PUBLIC \"-//SPRING//DTD BEAN//EN\" \"http://www.springframework.org/dtd/spring-beans.dtd\">\n"
 				+ "<!--\n"
 		    	+ "  - Root application context for the Countries application.\n"
 		    	+ "  - Web-specific beans are defined in \"countries-servlet.xml\".\n"
 				+ "  -->\n"
 				+ "<beans>\n"
 		    	+ "	<bean id=\"messageSource\" class=\"org.springframework.context.support.ResourceBundleMessageSource\">\n"
 		    	+ "	    <property name=\"basename\" value=\"messages\"/>\n"
 				+ "	</bean>\n"
 		    	+ "	<bean id=\"countryService\" class=\"org.springframework.samples.countries.DefaultCountryService\"/>\n"
 				+ "</beans>\n";
 
 		xml = xml.replace("\n", "");
 		int endIndexXMLDeclaration = xml.indexOf(">") + 1;
 		String xmlDeclaration = xml.substring(0, endIndexXMLDeclaration);
 		String doctypeDeclaration = xml.substring(endIndexXMLDeclaration, xml
 				.indexOf(">", endIndexXMLDeclaration));
 
 		System.out.println(xmlDeclaration);
 		System.out.println(doctypeDeclaration);
 
 	}
 }

Gruß Tom
 
Ich habe schon xml gesehen, bei denen zwischen Declaration und Doctype ein Kommentar stand. Aber man könnte das ganze ja dann überprüfen. Werds dann wohl auf diese Weise lösen.

Danke Dir
 
Zurück