给定一个我想用 XPath 解析的 XML 片段,我首先需要提取 namespace 以添加到 namespace 管理器中。我一直在尝试找出提取定义命名空间的 xml 属性所需的正则表达式模式。例如,我想获取所有 namespace ,我可以对其进行一些更基本的字符串操作,以分离 namespace 名称和 url。
xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-02-12T12:41:45"
属性名称将始终以 xmlns: 开头,我需要正则表达式读取到值的末尾,因此包括最后一个 "
或者,更通用的模式可以完成提取 name="value"形式的所有属性的工作,我可以做一些字符串比较以查看每个属性是否是一个命名空间。
<my:StationLookupValues xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-02-12T12:41:45"><my:StationLookupValue>Hull Inspectors</my:StationLookupValue></my:StationLookupValues><my:StationLookupValues xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-02-12T12:41:45"><my:StationLookupValue>Barnsley Inspectors</my:StationLookupValue></my:StationLookupValues><my:StationValue xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-02-12T12:41:45">Hull Inspectors</my:StationValue>
我一直找不到这样的例子,也没有自己解决。非常感谢这方面的任何帮助。
[编辑] 我知道应该使用 XML 解析器,这就是我要做的。但我只有一个要传递的 XML 片段,所以我必须首先构建一个 namespace 管理器,为此我需要提取所使用的 namespace 。
最佳答案
试试这个模式:'xmlns:(.*?)=(".*?")'
意思是
- 文字字符串 xmlns:
- 到=的最短字符串
- 一个引号,后跟最短的字符串,直到下一个引号
括号表示第一组包含命名空间名称,第二组是值。根据您是否想要将所有内容合而为一,以及是否想要组中的报价进行调整。
正如 Tomalak 在他的回答中指出的那样,这充满了危险。它可能会匹配作为注释的一部分或作为数据嵌入字符串中的模式等。这就是为什么正则表达式不适用于解析 xml 数据的原因——因为您实际上不是解析,您'只是寻找模式而不考虑上下文)。
关于xml - 使用正则表达式检索 XML 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2296275/