如何在XML文件中的特定节点的第一个和最后一个之间获取?

时间:2012-07-17 17:48:02

标签: xml regex xpath

考虑我有一个包含以下数据的文件:

  ...
    <wsdl:message>
      ...
    </wsdl:message>
    <wsdl:message>
      ...
    </wsdl:message>
    <wsdl:message>
      ...
    </wsdl:message>
  ...

在第一个<wsdl:message>和最后一个</wsdl:message>之间获取所有数据的正确的正则表达式是什么?

或者,(如建议的那样),一个适当的XPath解决方案。

主要想法是我想找到并替换那部分数据。

2 个答案:

答案 0 :(得分:1)

只需使用

//x:message/node()

其中前缀x:(以托管 XPath的编程语言)绑定到wsdl命名空间 - 这通常称为“注册命名空间”。)

或者,如果您无法注册此命名空间,请使用

//*[local-name()='message' 
  and 
    namespace-uri() = 'http://schemas.xmlsoap.org/wsdl/'
    ]/node()

答案 1 :(得分:0)

XPath

/*/wsdl:message[fn:position() > 1 and fn:position() < fn:last()]

应该这样做。

修改

对于XPath 1.0(以及PHP的代码)

<?php
$string = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:wsdl="/">
    <wsdl:message> 
      One
    </wsdl:message> 
    <wsdl:message> 
      Two 
    </wsdl:message> 
    <wsdl:message> 
      Three 
    </wsdl:message> 
    <wsdl:message> 
      Four 
    </wsdl:message> 
    <wsdl:message> 
      Five 
    </wsdl:message> 
    <wsdl:message> 
      Six 
    </wsdl:message>
</root>
XML;

print $string;
$xml = new SimpleXMLElement($string);

print_r($xml->xpath('/*/wsdl:message[position() > 1'.
                    ' and position() < last()]'));

?>