0

次のように配置された XML ファイルがあります。

<xml:head>
    <xml:reportObject>
        <xml:device>
            <device:id>
                <id:value = value />
            </device:id>
            <device:OpAttributes>
                <OpAttributes:value = value />
            <device:OpAttributes>
            <device:Config>
                <Config:NetConfig>
                    <NetIF:ID = value />
                    <NetHost>
                        <NetHost:MAC = value />
                    </NetHost>
                </Config:NetConfig>
            </device:Config>
            <device:Role = value />
            <device:TaggedString name="value" value="value" />
            <device:Addition junk ........ />
        </xml:device>
    </xml:reportObject>
    Lather, Rinse, Repeat for several instances on reportObjects
</xml:head>

私の問題は、3 つの値 (具体的には "NetHost:MAC"、"device:Role"、および "device:TaggedString" の値) を解析してデータベース列の場所にダンプしようとしていることです。

私たちが使用するプログラムは、正規表現の一致に基づいてこれを行う社内ツールですが、「xml:device」タグの後の XML はフラットラインであるため、「xml:device」ですべてのものを一致させる方法を探す必要があります。タグを追加してさらに解析を続けます...キッカーは、「device:Role」タグがクライアントの場合にのみ解析を続行できることです。それ以外のものはあまりにも多くのジャンクと私の解析爆弾を与えます.

これを行うための私の最近の試み(およびその後の失敗)は次のようになります。

<xml:device([\s\S]+?(\b\w*Client\w*\b))</xml:device>

これは私の一致の 90% で機能しますが、ファイル内のどこかで [\s\S]+? 以前の一致がないため、一致が低すぎて、まだ解析爆弾を作成しています。

助けがあれば、残りの髪を引っ張ることができなくなります。

正規表現は、現時点で社内ツールを介してこの解析を行う必要がある唯一のオプションです。何か違うと思ったら、教えてください。

4

1 に答える 1

2

NSXMLParser正規表現を使おうとしているときに髪を引っ張る代わりに (女の子は禿げたプログラマーが好きではありません)、クラスを試してみてください(これはApple によって適切に文書化されています)。このタスクのセットアップははるかに簡単になります。

于 2013-02-11T21:46:36.650 に答える