我需要读取一个复杂的XML文件,我需要检索名为“Disorder”的每个节点的特定父节点...让我展示一下xml文件:
<ClassificationNode>
<Disorder id="14879">
<OrphaNumber>101943</OrphaNumber>
<ExpertLink lang="en">
http://www.orpha.net/consor/cgi-bin/OC_Exp.php?lng=en&Expert=101943
</ExpertLink>
<Name lang="en">Rare hepatic and biliary tract tumor</Name>
</Disorder>
<ClassificationNodeChildList count="3">
<ClassificationNode>
<Disorder id="21130">
<OrphaNumber>300557</OrphaNumber>
<ExpertLink lang="en">
http://www.orpha.net/consor/cgi-bin/OC_Exp.php?lng=en&Expert=300557
</ExpertLink>
<Name lang="en">Carcinoma of the ampulla of Vater</Name>
</Disorder>
<ClassificationNodeChildList count="0"></ClassificationNodeChildList>
</ClassificationNode>
每个标签Disorder都有一个Disorder parent,在这种情况下是Disorder Name“壶腹壶腹癌”,它是无序“稀有肝和胆道肿瘤”的孩子。 我试图用PHP中的XPath检索这些值,这是我的代码:
$parent = $simplexml->xpath("../../Disorder/Name");
但是数组对我来说是零...我尝试了很多次与其他xpath语法,但没有成功。我正在使用SimpleXML来读取Disorder节点,因为XML很小(0.36MB)并且SimpleXML比XMLReader更简单。这是我读取节点的代码:
if ( $node->nodeType == XML_ELEMENT_NODE && $node->localName == "Disorder") {
$dom = new DomDocument();
$data = $dom->importNode($node,true);
$dom->appendChild($data);
$simplexml = simplexml_import_dom($data);
$disease['name'] = "$simplexml->Name";
$disease['orpha'] = "$simplexml->OrphaNumber";
$disease['link'] = "$simplexml->ExpertLink";
$disease['parent'] = ????? ;
在“?????”是我需要插入实际紊乱的Disorder父级的名称。 我努力了2天没什么......:/
任何人都可以帮助我?
答案 0 :(得分:2)
在一般的XML / XPath意义上,父代将是..
。但是,就您的域而言, 父级障碍与 XML / XPath父级 不同。从名为“Vater壶腹癌”的Disorder
点开始,你必须上升三次(../../..
)才能到达包含{{1}的祖先ClassificationNode
名为“罕见的肝胆道肿瘤”。
具体来说,鉴于你的XML(修复得很好):
Disorder
此XPath
<ClassificationNode>
<Disorder id="14879">
<OrphaNumber>101943</OrphaNumber>
<ExpertLink lang="en">http://www.orpha.net/consor/cgi-bin/OC_Exp.php?lng=en&Expert=101943</ExpertLink>
<Name lang="en">Rare hepatic and biliary tract tumor</Name>
</Disorder>
<ClassificationNodeChildList count="3">
<ClassificationNode>
<Disorder id="21130">
<OrphaNumber>300557</OrphaNumber>
<ExpertLink lang="en">http://www.orpha.net/consor/cgi-bin/OC_Exp.php?lng=en&Expert=300557</ExpertLink>
<Name lang="en">Carcinoma of the ampulla of Vater</Name>
</Disorder>
<ClassificationNodeChildList count="0"/>
</ClassificationNode>
</ClassificationNodeChildList>
</ClassificationNode>
按要求返回父级的名称:
//Disorder[@id='21130']/../../../Disorder/Name/text()
因此,您的PHP语句可以按如下方式进行调整:
"Rare hepatic and biliary tract tumor"
假设您想要$parent = $simplexml->xpath("../../../Disorder/Name/text()");
中的父母紊乱的名称,或者只是
$parent
如果您想在$parent = $simplexml->xpath("../../../Disorder");
中使用父级障碍元素。
答案 1 :(得分:1)
您遇到的问题是,您通过 XMLReader 中的节点扩展转换为 DOMElement 的文档片段不包含&#34; parent&#34; RESP。 &#34;子&#34; (父/子甚至是错误的术语,你在这里寻找前面或下面的节点,而不是父节点或子节点):
<Disorder id="14879">
<OrphaNumber>101943</OrphaNumber>
<ExpertLink lang="en">
http://www.orpha.net/consor/cgi-bin/OC_Exp.php?lng=en&Expert=101943
</ExpertLink>
<Name lang="en">Rare hepatic and biliary tract tumor</Name>
</Disorder>
正如这个片段所示,它是父母&#34;只要。您需要将整个 ClassificationNode
元素作为xpath的基础。然后,您应该能够像already outlined by kjhughes一样执行xpath查询。