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"

などなどを文字列配列に保存しますが、分割メソッドを使用してこれを行う方法はありますか、またはこれを行うためのより簡単で効率的な方法を誰かが提案できますか?

以下は、恐ろしく見える正規表現です。

\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)を使用して実行する方法です。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"
于 2012-08-30T10:48:27.750 に答える
0

何らかの理由で Sax を使用したくない場合 (私もお勧めします)、Eclipse が正規表現を拒否する理由は、パターン内の \ と文字列リテラル内の " をエスケープする必要があるためです。したがって、文字列をパターン化します。定義は次のようになります。

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