2012-09-24 117 views
2

我有這樣的代碼評估的XPath查詢和檢索值

$XMLTranslationObject = new DOMDocument(); 
$XMLTranslationObject->load("../xdata/xml/translation/en-US/profile.xml"); 

$Xpath = new DOMXpath($XMLTranslationObject); 
$Result = $Xpath->evaluate("Field[@Name = 'AttachedFiles']")->nodeValue; 

echo $Result; 

和XML

<?xml version="1.0" encoding="ISO-8859-1"?> 
<Translation language="en-US"> 

    <!-- Basic Begin --> 
     <Field Name="SiteName">Brainfavor</Field> 
     <Field Name="Error">Error</Field> 
    <!-- Basic End --> 

    <!-- Header Begin --> 
     <Field Name="Name">Name</Field> 
     <Field Name="WorkingAt">Working at</Field> 
     <Field Name="Phone">Phone</Field> 

巫婆給了我下面的錯誤

公告:未定義的屬性:的DOMNodeList :: $ nodeValue在C:\ xampp \ htdocs \ brainbook \ profile \ loadmore.php上線30

我想要的就是檢索字段名稱爲AttachedFiles的行的值,只需運行簡單的Xpath查詢並檢索結果即可。使用XSLT很容易

<xsl:value-of select="$TranslationProfile/Field[@Name = 'AttachedFiles']"/> 

但我之前沒有使用PHP Xpath。

回答

2

正確的提法是

$Xpath->evaluate("string(Field[@Name = 'AttachedFiles'])"); 

這工作,因爲string功能的節點集(這居然會在這種情況下,僅僅由一個節點)轉換爲價值設定的第一個節點。

警告:這意味着如果有多個元素與查詢匹配,則只有第一個元素(按文檔順序)將返回其值。

+0

這工作,謝謝,但不是真的'$ Xpath->評估(「字符串(Field [@Name ='AttachedFiles'])」);'=='$ Xpath-> evaluate(「Field [@Name ='AttachedFiles']「) - nodeValue;'? '串'是唯一的方法? – Empeus

+0

@Empeus:不,你可以不用'string',但在這種情況下'evaluate'返回一個['DOMNodeList'](http://php.net/manual/en/class.domnodelist.php),你必須迭代。您可以在列表中的每個節點上訪問'nodeValue',但不能在列表本身上訪問。 – Jon

+0

我明白了,謝謝,但用'字符串'更容易 – Empeus