RegEx用可选的名称空间前缀提取第一个XML元素名称

时间:2015-08-31 21:04:26

标签: regex xml

我必须在xml中使用regEx第一个元素名称进行提取(忽略可选的名称空间前缀。

以下是XML1示例:

<ns1:Monkey xmlns="http://myurlisrighthereheremonkey.com/monkeynamespace">
 <foodType>
  <vegtables>
   <carrots>1</carrots>
  </vegtables>
 <foodType>   
</ns1:Monkey>

这是类似的XML,没有命名空间,XML2:

 <Monkey xmlns="http://myurlisrighthereheremonkey.com/monkeynamespace">
 <foodType>
  <vegtables>
   <carrots>1</carrots>
  </vegtables>
 <foodType>   
</Monkey>

我需要一个regEx,它会为XML1或XML2返回“Monkey”

到目前为止,我尝试了HERE这个适用于XML1的regEx&lt;(\ _ w +:)(\ w +)....但我不知道如何让它适用于XML2

1 个答案:

答案 0 :(得分:2)

由于它似乎是一次性工作,并且您实际上无法访问XML解析器,因此您可以使用2个正则表达式中的任何一个(仅适用于您提供的XML文件样本):

<(\w+:)?(\w+)(?=\s*xmlns="http://myurlisrighthereheremonkey\.com/monkeynamespace")

Demo 1

或者(如果使用正则表达式检查整个单个文件内容):

^\s*<(\w+:)?(\w+)

Demo 2

主要变化是2:

  • (\w+:)? - 添加?修饰符可使第一个捕获组成为可选
  • ^\s*在字符串的开头进行正则表达式匹配(猜测你没有XML声明),或者(?=\s*xmlns="http://myurlisrighthereheremonkey.com/monkeynamespace")前瞻强制匹配只有后跟可选空格和文字{ {1}}。

但是,您确实需要考虑更改支持XML解析的代码,它将使您负责维护代码的人的生活和生活变得更容易。