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>

我的问题是我试图解析出三个值(特别是“NetHost:MAC”、“device:Role”和“device:TaggedString”值)以转储到数据库列中的位置。

我们使用的程序是一个内部工具,它将根据 RegEx 匹配来执行此操作,但是由于“xml:device”标记之后的 XML 扁平化,我正在寻找一种方法来匹配每个“xml:device”标签继续进一步解析......踢球的是,如果“设备:角色”标签是客户端,我只能继续解析。其他任何东西都会带来太多垃圾和我的解析炸弹。

我最近的尝试(以及随后的失败)看起来像这样:

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

这适用于我 90% 的匹配项,但在文件中的某个位置 [\s\S]+? 由于缺少较早的匹配,匹配得太远了,并且仍然使我的解析炸弹。

任何帮助都会阻止我把剩下的头发拉到我们的身上。

RegEx 是我目前必须通过我们的内部工具进行此解析的唯一选择。如果你能想到一些不同的东西,请告诉我。

4

1 回答 1

2

不要在尝试使用正则表达式时拔掉头发(女孩不喜欢秃头的程序员),而是试试这个NSXMLParser类(Apple 很好地记录了这一点)。设置此任务会容易得多。

于 2013-02-11T21:46:36.650 回答