爬虫程序无法正确选择Symfony 2.3上的XML节点

爬虫程序无法正确选择Symfony 2.3上的XML节点,xml,symfony,xpath,symfony-2.3,web-crawler,Xml,Symfony,Xpath,Symfony 2.3,Web Crawler,我正在做一个导入QTI的应用程序,我遇到了以下问题: 我得到一个包含测试(assessmentTest)的XML文件,该文件依次包含对问题的引用(命名为assessmentItems)。XML文件如下所示: <?xml version="1.0" encoding="UTF-8"?> <assessmentTest xmlns="http://www.imsglobal.org/xsd/imsqti_v2p1" xmlns:xsi="http://www.w3.org/2001

我正在做一个导入QTI的应用程序,我遇到了以下问题:

我得到一个包含测试(assessmentTest)的XML文件,该文件依次包含对问题的引用(命名为assessmentItems)。XML文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<assessmentTest xmlns="http://www.imsglobal.org/xsd/imsqti_v2p1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqti_v2p1 imsqti_v2p1.xsd" identifier="AT-196b0997-3ec6-4b4e-8b22-c3d563f71291" title="Quiz example">
  <outcomeDeclaration identifier="SCORE" cardinality="single" baseType="float" />
  <testPart identifier="TP-9ee1d731-c360-4989-bb50-c8bae65d2f8a-2" navigationMode="nonlinear" submissionMode="simultaneous">
    <assessmentSection identifier="AS-b602c887-a711-417b-bfad-6fe005fc085f-3" required="false" fixed="false" title="" visible="true" keepTogether="true">
      <selection select="2" withReplacement="false" />
      <ordering shuffle="true" />
      <assessmentItemRef identifier="AIR-5d0d9526-80ba-4956-8017-0fe6b9ef45d7-9" href="test/AI-15149c8b-8856-4117-9de3-e073552e668d-4.xml" />
      <assessmentItemRef identifier="AIR-c112b4d4-6003-4d17-a2c5-55a2d3d6388c-24" href="test/AI-b6b27861-3d27-4876-afb3-c33daf2d7fad-19.xml" />
    </assessmentSection>
  </testPart>
  <outcomeProcessing>
    <setOutcomeValue identifier="SCORE">
      <sum>
        <testVariables variableIdentifier="SCORE" />
      </sum>
    </setOutcomeValue>
  </outcomeProcessing>
  <testFeedback access="atEnd" showHide="hide" outcomeIdentifier="outcomeIdentifier" identifier="outcomeValue" title="Detailed Breakdown">
    <p>The test is now complete. The following table shows a breakdown of your scores:</p>
    <table>
      <tbody>
        <tr>
          <td>The total score:</td>
          <td>
            <printedVariable identifier="SCORE" />
          </td>
        </tr>
      </tbody>
    </table>
  </testFeedback>
</assessmentTest>
返回以下错误:“当前节点列表为空。”

我尝试了xPath的其他变体,但得到了相同的错误


p.D.:很抱歉我的英语不好,这不是我的母语。

我不使用Symfony,但这是处理XML时常见的问题。您的XML在根级别定义了默认名称空间(
xmlns=“…”
),因此在前面提到的默认名称空间中会考虑所有没有不同默认名称空间声明和前缀的节点

根据,从2.4版开始,默认名称空间自动注册为
default
前缀,因此您可以尝试使用以下XPath:

/default:assessmentTest/default:testPart/default:assessmentSection/default:assessmentItemRef
更新:

对于我来说,在互联网上找到有关Symfony2中手动名称空间前缀注册的文档有点困难,您可以尝试类似的方法吗(从以下方面获得灵感):

我对自己说:

if (!empty($assessmentsTest)) {
    foreach ($assessmentsTest as $assessmentTest) {
        $crawler = new Crawler();
        $crawler->addXmlContent(file_get_contents(sys_get_temp_dir()."/qti-pack/".$assessmentTest));

        $items = $crawler->filterXPath('//assessmentItemRef');

        for ($i=0; $i < $items->count(); $i++) { 
            $assessmentsItem [] = $items->eq($i)->attr('href');
        }
    }
}
if(!empty($assessmentsTest)){
foreach($assessmentsTest作为$assessmentTest){
$crawler=新爬虫();
$crawler->addXmlContent(文件获取内容(sys\u get\u temp\u dir()。“/qti pack/”$assessmentTest));
$items=$crawler->filterXPath('//assessmentItemRef');
对于($i=0;$i<$items->count();$i++){
$assessmentsItem[]=$items->eq($i)->attr('href');
}
}
}

最后是一个简单的解决方案。

对不起,我使用的是Symfiny 2.3和'default:assessmentTest/default:testPart/default:assessmentSection/default:assessmentItemRef'对我不起作用,我尝试一下。我编辑了标题以澄清这一点。
/default:assessmentTest/default:testPart/default:assessmentSection/default:assessmentItemRef
$crawler->registerNamespace('default', 'http://www.imsglobal.org/xsd/imsqti_v2p1')
$items = $crawler->filterXPath('/default:assessmentTest/default:testPart/default:assessmentSection/default:assessmentItemRef');
if (!empty($assessmentsTest)) {
    foreach ($assessmentsTest as $assessmentTest) {
        $crawler = new Crawler();
        $crawler->addXmlContent(file_get_contents(sys_get_temp_dir()."/qti-pack/".$assessmentTest));

        $items = $crawler->filterXPath('//assessmentItemRef');

        for ($i=0; $i < $items->count(); $i++) { 
            $assessmentsItem [] = $items->eq($i)->attr('href');
        }
    }
}