Java .split()方法拆分XML参数

时间:2012-08-30 09:34:06

标签: java xml eclipse parsing split

我从XML文档获得这一行:

<?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">

我希望能够使用split方法将其拆分。例如,我想将每个参数保存到String数组中。

所以我想:

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

等等要保存到字符串数组中,无论如何使用split方法执行此操作,还是有人可以建议更简单,更有效的方法来执行此操作?

这是可怕的正则表达式:

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

Eclipse不会接受这个,因为它有无效的字符常量,有人知道如何克服这个错误吗?

3 个答案:

答案 0 :(得分:3)

使用DOM或SAX读取它,处理属性并将其添加到地图中。

答案 1 :(得分:2)

有多种方法可以表示相同的XML文档(见下文),空格和引号的差异可能使编写(和维护)正则表达式变得困难。

input.xml(表示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(表示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'>

我建议使用XML解析器。以下是使用StAX (JSR-173)完成的方法。 Java SE 6中包含StAX解析器的实现。

<强>演示

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);
        }
    }

}

<强>输出

contentScriptType="text/ecmascript"
width="1024"
zoomAndPan="magnify"
contentStyleType="text/css"
viewBox="0 0 1024 768"
height="768"
preserveAspectRatio="xMidYMid meet"
version="1.0"

答案 2 :(得分:0)

如果你出于某些原因不想使用Sax(我也建议使用),那么Eclipse拒绝你的正则表达式的原因是你必须在模式和“字符串文字中”转义\。所以模式字符串定义应如下所示:

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