1

我很难在 XML 文件中查找特定的代码块。

XML 类似于此示例:

<object>
   <class>File</class>
   <name>Fall</name>
<desc>Description of Seasons: Fall</desc>
</object>

<object>
   <class>File</class>
   <name>Summer</name>
<desc>Description of Seasons: Summer</desc>
</object>

<object>
   <class>Image</class>
   <name>Summer1</name>
<desc>Image of Seasons: Summer</desc>
</object>

<object>
   <class>File</class>
   <name>Weather3</name>
<desc>Description of Weather</desc>
</object>

基本上我想要一个正则表达式只返回名为Summer.

我该怎么办?

我被困在这里:

<object>(.*?)<class>File</class>(.*?)Description of Seasons: Summer(.*?)</object>

但我也得到了搜索结果中的第一个对象。

我有点 (.) 来包含新行,因此是语法。

4

3 回答 3

3

不使用正则表达式真的会更好。请参阅此处了解为什么不应该使用正则表达式来解析 XML 的充分理由。

一个更简单的方法是使用XPath ,例如

//object[name="Summer"]

如果您将此 XPath 表达式应用于您的 XML(假设您将格式错误的 XML 包含在根标记中),那么它只会选择“名为 Summer 的第二个对象”。

在大多数(如果不是所有)编程语言(C/C++、Java、.NET、javascript 等)中都有支持 XPath 的 XML 库。

于 2013-10-23T23:50:22.600 回答
0

不能保证正则表达式适用于所有场景。在某些情况下它会失败。无论如何,解析器都保证适用于每种情况。XPath是你想要的。这是关于 SO 的日常话题,所以我将跳过布道并尝试解决问题。

我正在使用 PCRE 语法:

~<object>.*?</object>.*?(<object>.*?</object>)~s

您将需要s修饰符以便.匹配换行符。您的第二个对象将被分组捕获#1

这是未经测试的,但应该可以工作。

于 2013-10-24T09:38:53.397 回答
0

正则表达式,顾名思义,只能识别正则语言。常规语言遵循常规抽水引理,该引理(粗略地)指出,在超出一定大小的常规语言的每个有效单词中,您会发现一段可无限重复以产生更多有效单词的文本部分。

然而,XML 不是一种常规语言,它是一种CF 语言(您可以通过应用抽水引理来证明这一点。)

上下文无关语言只能由上下文无关文法描述,并由上下文无关解析器(LL(k)/LR(k)、CYK 或 Earley 解析器)解析,所有这些都产生正则表达式无法生成的解析树.

于 2013-10-24T11:00:39.647 回答