2012-07-17 47 views
0

考虑我有一个包含以下数据的文件:如何获取XML文件中特定节点的第一个和最后一个?

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

什么是适当的正则表达式来获得第一<wsdl:message>和最后</wsdl:message>之间的所有数据?或者,(如已经提出的),或者适当的XPath解决方案。

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

+4

使用XPath会更好,在我看来,使用正则表达式。 – 2012-07-17 17:49:45

+0

好的,谢谢,我已经编辑了这个问题来考虑你的建议......如果你能提供一个解决方案,那会很好。 – Sweety 2012-07-17 18:05:46

回答

1

只需使用

//x:message/node() 

其中前缀x:必然(在编程语言那就是托管 XPat h)到wsdl命名空间 - 这通常称为“注册命名空间”)。

或者,如果你不能够注册这个命名空间,使用

//*[local-name()='message' 
    and 
    namespace-uri() = 'http://schemas.xmlsoap.org/wsdl/' 
    ]/node() 
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()]')); 

?> 
+1

position()和last()是'native'xpath函数。你不需要用fn前缀他们: – 2012-07-17 18:29:25

+0

@DominicCronin - XPath 2.0使用'fn:position'。已更新的答案将PHP(Xpath 1.0)的代码作为一个例子。 – 2012-07-17 18:45:12

+1

@EdHeal:在XPath 2.0规范中使用'fn:'命名空间前缀来显示哪些函数可以被用户调用。在实际的XPath代码中没有必要使用'fn:'。请参阅http://www.w3.org/TR/xquery-operators/#func-concat,其中的例子显示'concat()'被调用时没有命名空间前缀。 – LarsH 2012-07-17 20:50:39

相关问题