使用复杂XML中的Xpath读取父节点的父节点

时间:2015-03-10 16:15:15

标签: php xml xpath

我需要读取一个复杂的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天没什么......:/

任何人都可以帮助我?

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&amp;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&amp;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查询。