使用xpath查询返回子节点


Return child nodes using xpath query

我正在尝试返回下面节点"core"的所有"field"子级:

<archive xmlns="http://rs.tdwg.org/dwc/text/" metadata="eml.xml">
  <core encoding="utf-8" fieldsTerminatedBy="'t" linesTerminatedBy="'n" fieldsEnclosedBy="" ignoreHeaderLines="1" rowType="http://rs.tdwg.org/dwc/terms/Occurrence">
    <files>
      <location>occurrence.txt</location>
    </files>
    <id index="0" />
    <field index="1" term="http://rs.tdwg.org/dwc/terms/class"/>
    <field index="2" term="http://rs.tdwg.org/dwc/terms/maximumDepthInMeters"/>
    <field index="3" term="http://purl.org/dc/terms/language"/>
    <field index="4" term="http://rs.tdwg.org/dwc/terms/coordinatePrecision"/>
    <field index="5" term="http://rs.tdwg.org/dwc/terms/decimalLatitude"/>
 </core>
</archive

我有以下PHP:

$xml = new 'DOMDocument();
$xml->preserveWhiteSpace = false;
$xml->load($input_xml);
$xpath = new 'DOMXpath($xml);
$xpath->registerNamespace('ns', $xml->documentElement->namespaceURI);

像这样的东西可以检索特定的"字段"并获得它的索引:

$query = $xpath->query("//ns:field[contains(@term, 'http://rs.tdwg.org/dwc/terms/class')]")->item(0);
$url = $query->attributes->getNamedItem("index")->nodeValue;

我在网上使用了各种各样的例子,尝试过如下查询。它们都不起作用:

$children = $xpath->query("//ns:core/field");
$children = $xpath->query("//core/field");
$children = $xpath->query("/core/field");
$children = $xpath->query("/core/*");
$children = $xpath->query("/archive/core/field");
$children = $xpath->query("//ns:core/ns:field");

最终,我试图实现的是返回"核心"下的所有"字段"节点,循环遍历它们,并根据它们的索引和术语创建一个数组。例如:

$myArray = array(
    "1" => "http://rs.tdwg.org/dwc/terms/class",
    "2" => "http://rs.tdwg.org/dwc/terms/maximumDepthInMeters",
    "3" => "http://purl.org/dc/terms/language",
);

如有任何帮助,我们将不胜感激。谢谢

可能是名称空间让您感到困惑;您也没有查询正确的属性(您查看的是index,但URL在term中)。试试这个代码:

foreach( $xpath->query('/ns:archive/ns:core/ns:field') as $field) {
    if ( $field->attributes->getNamedItem("term")->nodeValue ) {
        echo "URL: " . $field->attributes->getNamedItem("term")->nodeValue . "'n";
    }
}