2015-03-10 10 views
1

Мне нужно прочитать сложный XML-файл, и мне нужно получить конкретный родительский узел каждого узла под названием «Беспорядок» ... позвольте мне показать XML-файл:Прочитайте родительский родительский узел с Xpath в сложном 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 есть родитель-расстройство, в данном случае «Беспорядки» «Карцинома ампулы Vater» - это ребенок расстройства «Редкая опухоль печени и желчного тракта». Я попытался получить значение тезисов с XPath в PHP, что не мой код:

$parent = $simplexml->xpath("../../Disorder/Name"); 

Но массив достигает нуль до меня .... я пробовал много раз с другим XPATH синтаксиса, но никакого успеха. Я использую SimpleXML для чтения Disorder узлов, поскольку XML является небольшим (0.36MB) и SimpleXML является более простым, чем XMLReader.That это код, где им читают узлы:

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'] = ????? ; 

In «???? ?» где мне нужно вставить имя родителя Disorder фактического Disorder. Я так старался в течение 2 дней и ничего ...:/

Кто-нибудь может мне помочь?

ответ

2

В общем смысле XML/XPath родитель будет ... Однако в смысле вашего домена родительское расстройство - это не то же самое, что и Исходный код XML/XPath. С точки зрения Disorder, названной «Карцинома ампулы Ватера», вы должны подняться три раза (../../..), чтобы добраться до предка ClassificationNode, который содержит Disorder с названием «Редкая опухоль печени и желчных путей».

В частности, учитывая ваш XML (отремонтировали быть хорошо сформирован):

<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> 

Это XPath

//Disorder[@id='21130']/../../../Disorder/Name/text() 

возвращает имя родителя в соответствии с просьбой:

"Rare hepatic and biliary tract tumor" 

Таким образом, ваш оператор PHP можно настроить следующим образом:

$parent = $simplexml->xpath("../../../Disorder/Name/text()"); 

при условии, что вы хотите, чтобы имя родительского расстройства в $parent, или просто,

$parent = $simplexml->xpath("../../../Disorder"); 

если вы хотите сам беспорядок родительского элемента в $parent.

+0

Спасибо за ответы, ребята, я решил проблему, используя DOMNodeList. Я создал метод в PHP, этот метод преобразует узел, где мне нужно извлечь данные в DOMNodeList. С помощью NodeList легко извлечь данные с помощью префикса «childNodes». Кстати, спасибо o // –

1

Проблемы у вас есть то, что фрагмент документа вы включаете в DOMElement через узел-расширение от XMLReader не содержит «родительские» соотв. «Ребенок» (родитель/ребенок неправильные термины даже, вы ищете до или после узлов здесь, а не родительские или дочерних узлов):

<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> 

В этом фрагменте показывает, что это «родитель» только.Вам нужно взять весь ClassificationNode элемент в качестве базы для вашего xpath. Затем вы должны выполнить запрос xpath, например already outlined by kjhughes.

Смежные вопросы