我从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不会接受这个,因为它有无效的字符常量,有人知道如何克服这个错误吗?
答案 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?=(?:(?:\\\\[,\"']|[^,\"'])+|\"(?:\\\"|[^\"])*(?<!\\)\"|'[^']*'|)";