0

我有来自 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 方法将其拆分。例如,我想将每个参数保存到一个字符串数组中。

所以我想:

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

等等等等要保存到一个字符串数组中,有没有使用 split 方法来做到这一点,或者任何人都可以建议一种更简单、更有效的方法来做到这一点?

这是看起来很吓人的正则表达式:

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

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

4

3 回答 3

3

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

于 2012-08-30T09:36:59.623 回答
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)完成它。StAX 解析器的实现包含在 Java SE 6 中。

演示

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"
于 2012-08-30T10:48:27.750 回答
0

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

String regex = "\\s(.*?)\\s?=(?:(?:\\\\[,\"']|[^,\"'])+|\"(?:\\\"|[^\"])*(?<!\\)\"|'[^']*'|)";
于 2012-08-30T10:30:02.530 回答