2016-02-12 92 views
1

您好我有问题在使用名称空间获取XML文件中的属性的值。XPath使用名称空间来选择属性的值

<module name="ietf-inet-types" 
     xmlns="urn:ietf:params:xml:ns:yang:yin:1" 
     xmlns:inet="urn:ietf:params:xml:ns:yang:ietf-inet-types"> 
    <namespace uri="urn:ietf:params:xml:ns:yang:ietf-inet-types"/> 
    <prefix value="inet"/> 
</module> 

我想获得“inet”作为我的xpath的结果。我用这个链接Xpath to select value of sibling attribute with namespace作为参考,并想出了:

$xml->xpath('/n:module/n:prefix/@n:value'); 

其中n是命名空间前缀。然而,我得到一个空数组作为结果,我在这里做错了什么?

更新: 继承人一些我用来检索值的php代码。

//gets the namespace from the model 
$xpathNamespace = getXpathNamespace($domxml); 
$xml = simplexml_load_string($domxml->saveXML()); 
$xml->registerXPathNamespace("n", $xpathNamespace); 
print_r($xml->xpath('/n:module/n:prefix/@n:value')); 

回答

1

在XML属性没有命名空间的标签未在任何命名空间(如value):默认命名空间不应用于属性。

尝试的XPath:

/n:module/n:prefix/@value 
+0

嗨我试过,但得到的结果与我使用xpath'/ n:module/n:prefix /'时的结果相同。其结果是:'Array([0] => SimpleXMLElement Object([@attributes] => Array([value] => inet)))' – olliejjc16

+2

@ olliejjc16在这种情况下,您是否可以用代码更新问题使用(特别是你如何将'n'与XPath处理器中的名称空间关联起来:但是使它成为一个完整的但最小的重新创建)。 – Richard

+1

@ olliejjc16这可能会提供一些指导:[我可以使用SimpleXML和Xpath直接选择元素属性吗?](http://stackoverflow.com/questions/4045600/can-i-use-simplexml-xpath-to-directly -select-an-elements-attribute) – har07

1

确定这里的解决方案由于对双方理查德和har07合并的帮助。要访问前缀的值,我使用Richard建议的以下xpath。从har7发布的链接中的信息中,我访问了数组中的第一个元素,并将其转换为一个字符串,并得到了值“inet”。继承人代码:

$prefix = $xml->xpath('/n:module/n:prefix/@value'); 
print_r((string)$prefix[0]); 

感谢双方的帮助!

相关问题