如何获取XML中同标签不同层级下的目标Other-source_anchor节点值?
解决特定XML区块内节点提取的问题
看起来你已经精准定位到了Gene-commentary_heading为GeneOntology的节点,但卡在了只提取该区块内的Other-source_anchor上——之前用全局搜索会把上层的"GOA"也捞出来,而直接遍历节点又没结果,对吧?
问题根源
你当前的代码用$doc->getElementsByTagName('Other-source_anchor')是全局搜索整个XML文档,自然会包含所有匹配的节点。而正确的做法应该是把搜索范围限定在GeneOntology标题所在的父级区块内部,而不是整个文档。
从你给出的XML片段能看到,Gene-commentary_heading是某个Gene-commentary元素的子节点,你需要的那些Other-source_anchor(比如"DNA binding")都在这个父Gene-commentary的后代节点里。
修正后的代码
$esearch_test = "https://www.ncbi.nlm.nih.gov/gene/7128?report=xml&format=text"; $result = file_get_contents($esearch_test); $doc = new DOMDocument(); $doc->loadXML($result); $c = 1; foreach($doc->getElementsByTagName('Gene-commentary_heading') as $headingNode) { if ($headingNode->textContent === "GeneOntology"){ // 拿到标题所在的父级Gene-commentary容器,这是我们的搜索边界 $parentBlock = $headingNode->parentNode; // 只在这个父容器内部搜索Other-source_anchor节点 $anchorNodes = $parentBlock->getElementsByTagName('Other-source_anchor'); foreach ($anchorNodes as $subnode){ echo "<pre>$c: " . $subnode->nodeName . "</pre>"; echo "<pre>$c: " . $subnode->nodeValue . "</pre>"; } } $c++; }
核心改进说明
- 锁定搜索范围:通过
$headingNode->parentNode获取到包含目标标题的父级Gene-commentary元素,这样后续的搜索就只会在这个区块里进行,不会跑到全局去。 - 局部搜索替代全局:调用父元素的
getElementsByTagName方法,而不是全局的$doc对象的方法,这就能精准拿到该区块内的所有Other-source_anchor节点。
可选:过滤掉"GOA"这类来源节点
如果你想进一步排除掉上层的"GOA",只保留功能相关的锚点(比如"DNA binding"),可以加个上下文判断,检查节点是否在Function标签的层级下:
foreach ($anchorNodes as $subnode){ $currentNode = $subnode; $isFunctionRelated = false; // 向上遍历祖先节点,检查是否在Function区块内 while($currentNode = $currentNode->parentNode){ if ($currentNode->nodeName === 'Gene-commentary') { $labelNodes = $currentNode->getElementsByTagName('Gene-commentary_label'); if ($labelNodes->length > 0 && $labelNodes[0]->textContent === "Function") { $isFunctionRelated = true; break; } } } if ($isFunctionRelated) { echo "<pre>$c: " . $subnode->nodeName . "</pre>"; echo "<pre>$c: " . $subnode->nodeValue . "</pre>"; } }
这样就能完美提取到你想要的那些功能描述类的Other-source_anchor值了。
内容的提问来源于stack exchange,提问作者Nemo
相关产品推荐
相关产品推荐

