DOMDocument getelementbyid冲突?

DOMDocument getelementbyid冲突?

问题描述:

我有一个javascript popup,“成功”使用PHP来加载另一个页面作为DOMDocument和“成功”通过ID找到一个元素来显示它的文本使用nodeValue ...但是... nodeValue调用返回不是内部文本所需的元素,但是具有相同名称的锚标记内的文本。下面是一些代码:DOMDocument getelementbyid冲突?

的HTML和PHP这看似“作品”:

<span style="position:relative;"><span id="favelas" class="popup"> 

<?php 

// Create a new DOMDocument object 
$doc = new DOMDocument; 

// enable user error handling 
libxml_use_internal_errors(true); 

// Validate our document before referring to the id 
$doc->validateOnParse = true; 

// Load the key terms and identifications html file 
$doc->loadHtml(file_get_contents('http://teachers.dadeschools.net/jzoeller/APHG/0-Key-Terms-Identifications.html')); 

// Print in readable form the content the element by id 
print_r($doc->getElementById('favela')->nodeValue); 

?> 

</span><a href="javascript:void(null);" onMouseover="ShowPop('favelas');" onMouseout="HidePop('favelas');">favelas</a></span> 

现在,“应该”显示是在上面的代码中引用的页面术语贫民窟的定义。我所得到的仅仅是“贫民窟”这个词。

这里的一些代码,由PHP的页面加载这个时候:

<tr> 
<td><a name="favela"> 
favela</a></td> 
<td class="def" id="favela">A shantytown or slum, especially in Brazil.</td> 
<td>07</td> 
<td>06</td> 
</tr> 

调试用的var_dump给了我这样的:

对象(一个DOMElement)#1(17){[ “tagName”] => string(1)“a”[“schemaTypeInfo”] => NULL [“nodeName”] => string(1)“a”[“nodeValue”] => string(8)“favela” > [“nodeType”] => int(1)[“parentNode”] => string(22)“(对象值省略)”> [“childNodes”] => string(22) “firstChild”] => string(22)>“(object value omitted)”[“lastChild”] => string(22)“(object value omit (22)“(对象值省略)”> [“previousSibling”] => NULL [“attributes”] => string(22) “namespaceURI”] => NULL> [“prefix”] => string(0)“”[“localName”] => string(1)“a”[“baseURI”] => NULL> [“textContent”] = > string(8)“favela”}

这似乎是说它有一个名为“favela”的锚,而不是名为“favela”的td。是什么赋予了?!

+0

这是为什么标记为“Javascript”。这不是一个关于在PHP中实现的DOMDocument的PHP问题吗? – jfriend00 2015-04-03 23:02:58

+0

我不知道DOMDocument,但我认为它处理HTML为_html40 loose_,并且那里'a'元素的'name'属性是一个ID属性(ID属性不需要名称为“id” )。因为你会发现'a'。 – 2015-04-03 23:11:48

+0

好吧,正如我怀疑的那样,它在锚点上绊倒;那么如何跳过锚点并获得id的第二个实例,在这种情况下是“favela”。另外,谢谢你的解释。我希望我的解决方案如此简洁! – 2015-04-04 00:16:13

您可以使用DOMXPath查询,而不是getElementById()躲闪name属性及与“贫民窟”的id属性只针对元素:

$xpath = new DOMXPath($doc); 
$favelaElement = $xpath->query('//*[@id="favela"]')->item(0); 

print_r($favelaElement->nodeValue); 

输出:

A shantytown or slum, especially in Brazil. 
+0

谢谢,我必须离开项目几天......但您的解决方案的工作。只有一个小问题:我使用的编辑软件似乎对使用引号非常敏感,所以我发现我必须用下面的代码替换:('// * [@ id =“favela”]'): ( “// * [@ id中= '贫民区']”)。 – 2015-04-09 12:58:47