Java .split() Method To Split XML Parameters

2019-08-29 20:08发布

I have this line from an XML document:

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" contentScriptType="text/ecmascript" width="1024" zoomAndPan="magnify" contentStyleType="text/css" viewBox="0 0 1024 768" height="768" preserveAspectRatio="xMidYMid meet" version="1.0">

I want to be able to split it up, using the split method. For example i want to save each parameter into a String array.

So i'd like:

contentScriptType="text/ecmascript" 
width="1024" 
zoomAndPan="magnify" 
contentStyleType="text/css" 
viewBox="0 0 1024 768" 
height="768"

etc etc to be saved into a string array, is there anyway to do this using the split method, or can anybody suggest an easier, more efficient way to do this?

Here is the scary looking regular expression:

\s(.*?)\s?=(?:(?:\\[,"']|[^,"'])+|"(?:\\"|[^"])*(?<!\\)"|'[^']*'|)

Eclipse wont accept this as it has invalid character constants, anybody know how to overcome this error?

3条回答
【Aperson】
2楼-- · 2019-08-29 21:06

If you for some reason don't want to use Sax (which I would suggest too), the reason that Eclipse is rejecting your regular expression is that you have to escape \ in the pattern and " in the String literal. So you pattern string definition should look like:

String regex = "\\s(.*?)\\s?=(?:(?:\\\\[,\"']|[^,\"'])+|\"(?:\\\"|[^\"])*(?<!\\)\"|'[^']*'|)";
查看更多
爷、活的狠高调
3楼-- · 2019-08-29 21:11

There are multiple ways to represent the same XML document (see below), differences in white space and quotes can make it difficult to write (and maintain) a regular expression.

input.xml (representation 1)

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" contentScriptType="text/ecmascript" width="1024" zoomAndPan="magnify" contentStyleType="text/css" viewBox="0 0 1024 768" height="768" preserveAspectRatio="xMidYMid meet" version="1.0">

input.xml (representation 2)

<?xml version="1.0" encoding="UTF-8"?>
<svg 
     xmlns:xlink = 'http://www.w3.org/1999/xlink'
     xmlns = 'http://www.w3.org/2000/svg' 
     contentScriptType = 'text/ecmascript' 
     width = '1024'
     zoomAndPan = 'magnify'
     contentStyleType = 'text/css'
     viewBox = '0 0 1024 768'
     height = '768'
     preserveAspectRatio = 'xMidYMid meet'
     version = '1.0'>

I would recommend using an XML parser. Below is how it could be done using StAX (JSR-173). An implementation of a StAX parser is included in Java SE 6.

Demo

package forum12193899;

import java.io.StringReader;

import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory xif = XMLInputFactory.newFactory();
        StreamSource xml = new StreamSource("src/forum12193899/input.xml");

        String xmlString = "<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns=\"http://www.w3.org/2000/svg\" contentScriptType=\"text/ecmascript\" width=\"1024\" zoomAndPan=\"magnify\" contentStyleType=\"text/css\" viewBox=\"0 0 1024 768\" height=\"768\" preserveAspectRatio=\"xMidYMid meet\" version=\"1.0\">";
        XMLStreamReader xsr = xif.createXMLStreamReader(new StringReader(xmlString));

        xsr.nextTag(); // Advance to "svg" element.
        int attributeCount = xsr.getAttributeCount();
        String[] array = new String[attributeCount];
        for(int x=0; x<attributeCount; x++) {
            StringBuilder stringBuilder = new StringBuilder();
            array[x]= xsr.getAttributeLocalName(x) + "=\"" + xsr.getAttributeValue(x) + "\"";
        }

        // Output the Array
        for(String string : array) {
            System.out.println(string);
        }
    }

}

Output

contentScriptType="text/ecmascript"
width="1024"
zoomAndPan="magnify"
contentStyleType="text/css"
viewBox="0 0 1024 768"
height="768"
preserveAspectRatio="xMidYMid meet"
version="1.0"
查看更多
混吃等死
4楼-- · 2019-08-29 21:12

Read it with DOM or SAX, process the attributes and add it to a map.

查看更多
登录 后发表回答