使用正则表达式检索XML名称空间

使用正则表达式检索XML名称空间,xml,regex,Xml,Regex,给定一个要用XPath解析的XML片段,我首先需要提取名称空间以添加到名称空间管理器中。我一直在试图找出提取定义namepspace的xml属性所需的正则表达式模式。例如,我想获得所有名称空间,我可以对这些名称空间执行一些更基本的字符串操作,以分离名称空间名称和url xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-02-12T12:41:45" 属性名将始终以xmlns开头:我需要正则表达式读取到值

给定一个要用XPath解析的XML片段,我首先需要提取名称空间以添加到名称空间管理器中。我一直在试图找出提取定义namepspace的xml属性所需的正则表达式模式。例如,我想获得所有名称空间,我可以对这些名称空间执行一些更基本的字符串操作,以分离名称空间名称和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片段,所以我必须首先构建一个名称空间管理器,为了做到这一点,我需要提取所使用的名称空间。

尝试以下模式:'xmlns:(*?)=(“*?”)

这意味着

  • 文本字符串xmlns:
  • 最短的字符串=
  • 一个引号,后跟最短的字符串,直至以下引号
括号表示第一个组包含名称空间名称,第二个组是值。请根据是否希望将所有名称都包含在一个组中以及是否希望在组中使用引号进行调整


正如Tomalak在他的回答中指出的那样,这充满了危险。它可能会匹配作为注释的一部分或作为数据嵌入字符串中的模式等。这就是为什么正则表达式不适合解析xml数据的原因——因为您实际上不是在解析,您只是在寻找模式,而不考虑上下文)。

请注意这样的事情是可能的:

<elem>
  <x:elem xmlns:x="http://some/namespace" />
  <x:elem xmlns:x="http://some/other/namespace" />
  <elem xmlns="http://some/third/namespace" />
  <elem>
     XML Namespaces look like xmlns:foo="http://some/foo/namespace"!
  </elem>
  <!-- remember to put xmlns:x="http://some/namespace" back in! -->
  <elem />
</elem>

XML名称空间看起来像xmlns:foo=”http://some/foo/namespace"!

仅仅用正则表达式提取名称空间和前缀在某一点上会出错。

我认为,在不知道名称空间是什么的情况下处理包含名称空间的XML是某人在某处做错了什么的标志


我正试图弄清楚,如果你不知道你在寻找什么名称空间,你如何从创建名称空间管理器中获得任何好处。最奇怪的需求往往是需求,所以我不知道,但在我看来,这里真的发生了其他事情。

Bryan Oakley提到的正则表达式将奥克(带着他提到的警告)

其他人反对不知道要解析的XML文档中涉及的名称空间,他们忘记了通配符的XSD规范(请参阅)

您可能正处于这样一种场景中,就像我目前所处的情况,您只定义了一个基本XSD,但故意定义了元素以允许来自其他名称空间的任意XML扩展。在这种场景中,您必须使用XPath来解析来自使用XSD通配符元素的其他名称空间的任何XML我需要先弄清楚使用了哪些名称空间,然后在此基础上,为这些名称空间获取适当的预定义XPath,然后才能解析文档

当您只需要一个基本结构,而且还需要允许其他人独立地附加自己的信息的灵活性时,使用XSD通配符是很好的,这样您就不必不断地修改XSD以满足来自其他组的任何随机请求,并冒着破坏当前使用模式的风险


我自己还没有确定最终的解决方案,但倾向于使用正则表达式获取XML前缀(可能有误报),然后根据JAXP org.w3c.dom.Document.lookupNamespaceURI(字符串前缀)验证这些匹配消除误报。

可能是相关的。难道你还不知道名称空间吗?+1是出于良好的思考。我没有想到表达这些的不同方式。虽然名称空间本身是动态的,但很幸运的是,InfoPath构建xml的方式不是这样,所以我可以安全地寻找这种特定方式。不幸的是,由于OP apparEncy不理解XML名称空间,他也不理解为什么名称空间未知如此罕见。嗯,现在我已经更仔细地阅读了他的第二句话,我想我明白了你的意思。我不喜欢假设任何人问关于XML名称空间的问题都不理解它们,但我真的想不出什么时候会这样事实证明并非如此,快速阅读SO问题并没有发现任何反例。您的回答是,我不完全理解XML名称空间。我问这个问题是因为我试图从保存infopath表单时生成的XML中获取值。名称空间是动态的。每个表单模板都创建自己的名称基于表单名称和创建日期的空格。我的代码不知道xml来自哪个表单,所以我必须以某种方式拉出名称空间。但是如果你不知道名称空间,你怎么知道数据就是你要找的?如果你得到的文档中有
foo
名称空间中的数据,那么
bar
namespa中的数据ce和
baz
名称空间中的数据,您应该查找哪个名称空间?您如何知道?