php SimpleXml和xpath:如何访问具有其他命名空间的节点中的子节点


php SimpleXml and xpath: How to acces children inside node that have other namespace?

我正在尝试遍历XML文档中的一组记录,但无法访问其他名称空间中的子节点。

这是我的PHP代码:
$xml = new SimpleXMLElement($xml);
$ns = $xml->getNamespaces(true);
$xml->registerXPathNamespace('ns', $ns['']);
$xmlRecords = $xml->xpath('//ns:recordData');
foreach ($xmlRecords as $record) 
{
    $enrichedData = $record->gzd->enrichedData; //Yes! Works!
    $originalData = $record->gzd->originalData; //empty
}

问题是$ originalData仍然为空,可能是因为节点originalData中的所有子节点都属于其他命名空间。我的问题是:如何在我的记录循环中获得这些子节点?我需要dcterms名称空间下的所有节点。

这是源xml:

<?xml version="1.0" encoding="UTF-8"?>
<searchRetrieveResponse xmlns="http://www.loc.gov/zing/srw/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/zing/srw/ srw-types.xsd">
  <version>1.2</version>
  <numberOfRecords>23</numberOfRecords>
  <records>
    <record>
      <recordSchema>http://standaarden.overheid.nl/sru/</recordSchema>
      <recordPacking>xml</recordPacking>
      <recordData>
        <gzd xmlns="http://standaarden.overheid.nl/sru" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:overheid="http://standaarden.overheid.nl/owms/terms/" xmlns:overheidrg="http://standaarden.overheid.nl/cvdr/terms/" xsi:schemaLocation="http://standaarden.overheid.nl/sru gzd.xsd">
          <originalData>
            <overheidrg:meta>
              <owmskern>
                <dcterms:identifier>123431_2</dcterms:identifier>
                <dcterms:title>Ligplaatsenverordening 2009</dcterms:title>
                <dcterms:language>nl</dcterms:language>
                <dcterms:type scheme="overheid:Informatietype">regeling</dcterms:type>
                <dcterms:creator scheme="overheid:Gemeente">Muiden</dcterms:creator>
                <dcterms:modified>2015-08-27</dcterms:modified>
              </owmskern>
              <owmsmantel>
                <dcterms:isFormatOf resourceIdentifier="">Onbekend</dcterms:isFormatOf>
                <dcterms:alternative>Ligplaatsenverordening 2009</dcterms:alternative>
                <dcterms:source resourceIdentifier="">artikel 149 van de Gemeentewet</dcterms:source>
                <dcterms:isRatifiedBy scheme="overheid:BestuursorgaanGemeente">gemeenteraad</dcterms:isRatifiedBy>
                <dcterms:subject>ruimtelijke ordening, verkeer en vervoer</dcterms:subject>
                <dcterms:issued>2012-12-20</dcterms:issued>
              </owmsmantel>
              <cvdripm>
                <overheidrg:inwerkingtredingDatum>2013-01-01</overheidrg:inwerkingtredingDatum>
                <overheidrg:uitwerkingtredingDatum />
                <overheidrg:betreft>Onbekend</overheidrg:betreft>
                <overheidrg:kenmerk>Onbekend</overheidrg:kenmerk>
                <overheidrg:onderwerp />
                <overheidrg:gedelegeerdeRegelgeving>&lt;al &gt;Geen&lt;/al&gt;</overheidrg:gedelegeerdeRegelgeving>
                <overheidrg:redactioneleToevoeging>&lt;al &gt;Geen&lt;/al&gt;</overheidrg:redactioneleToevoeging>
              </cvdripm>
            </overheidrg:meta>
          </originalData>
          <enrichedData>
            <organisatietype>Gemeente</organisatietype>
            <publicatieurl_xhtml>http://decentrale.regelgeving.overheid.nl/cvdr/xhtmloutput/Historie/Muiden/123431/123431_2.html</publicatieurl_xhtml>
            <publicatieurl_xml>http://decentrale.regelgeving.overheid.nl/cvdr/xmloutput/Historie/Muiden/123431/123431_2.xml</publicatieurl_xml>
          </enrichedData>
        </gzd>
      </recordData>
      <recordPosition>1</recordPosition>
    </record>
  </records>
</searchRetrieveResponse>

您可以将SimpleXMLElement子方法用于相应的命名空间,如children($ns['overheidrg'])children($ns['dcterms'])

例如:

$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<searchRetrieveResponse xmlns="http://www.loc.gov/zing/srw/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/zing/srw/ srw-types.xsd">
  <version>1.2</version>
  <numberOfRecords>23</numberOfRecords>
  <records>
    <record>
      <recordSchema>http://standaarden.overheid.nl/sru/</recordSchema>
      <recordPacking>xml</recordPacking>
      <recordData>
        <gzd xmlns="http://standaarden.overheid.nl/sru" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:overheid="http://standaarden.overheid.nl/owms/terms/" xmlns:overheidrg="http://standaarden.overheid.nl/cvdr/terms/" xsi:schemaLocation="http://standaarden.overheid.nl/sru gzd.xsd">
          <originalData>
            <overheidrg:meta>
              <owmskern>
                <dcterms:identifier>123431_2</dcterms:identifier>
                <dcterms:title>Ligplaatsenverordening 2009</dcterms:title>
                <dcterms:language>nl</dcterms:language>
                <dcterms:type scheme="overheid:Informatietype">regeling</dcterms:type>
                <dcterms:creator scheme="overheid:Gemeente">Muiden</dcterms:creator>
                <dcterms:modified>2015-08-27</dcterms:modified>
              </owmskern>
              <owmsmantel>
                <dcterms:isFormatOf resourceIdentifier="">Onbekend</dcterms:isFormatOf>
                <dcterms:alternative>Ligplaatsenverordening 2009</dcterms:alternative>
                <dcterms:source resourceIdentifier="">artikel 149 van de Gemeentewet</dcterms:source>
                <dcterms:isRatifiedBy scheme="overheid:BestuursorgaanGemeente">gemeenteraad</dcterms:isRatifiedBy>
                <dcterms:subject>ruimtelijke ordening, verkeer en vervoer</dcterms:subject>
                <dcterms:issued>2012-12-20</dcterms:issued>
              </owmsmantel>
              <cvdripm>
                <overheidrg:inwerkingtredingDatum>2013-01-01</overheidrg:inwerkingtredingDatum>
                <overheidrg:uitwerkingtredingDatum />
                <overheidrg:betreft>Onbekend</overheidrg:betreft>
                <overheidrg:kenmerk>Onbekend</overheidrg:kenmerk>
                <overheidrg:onderwerp />
                <overheidrg:gedelegeerdeRegelgeving>&lt;al &gt;Geen&lt;/al&gt;</overheidrg:gedelegeerdeRegelgeving>
                <overheidrg:redactioneleToevoeging>&lt;al &gt;Geen&lt;/al&gt;</overheidrg:redactioneleToevoeging>
              </cvdripm>
            </overheidrg:meta>
          </originalData>
          <enrichedData>
            <organisatietype>Gemeente</organisatietype>
            <publicatieurl_xhtml>http://decentrale.regelgeving.overheid.nl/cvdr/xhtmloutput/Historie/Muiden/123431/123431_2.html</publicatieurl_xhtml>
            <publicatieurl_xml>http://decentrale.regelgeving.overheid.nl/cvdr/xmloutput/Historie/Muiden/123431/123431_2.xml</publicatieurl_xml>
          </enrichedData>
        </gzd>
      </recordData>
      <recordPosition>1</recordPosition>
    </record>
  </records>
</searchRetrieveResponse>
XML;
$xml = new SimpleXMLElement($xml);
$ns = $xml->getNamespaces(true);
$xml->registerXPathNamespace('ns', $ns['']);
$xmlRecords = $xml->xpath('//ns:recordData');
foreach ($xmlRecords as $record)
{
  $enrichedData = $record->gzd->enrichedData; //Yes! Works!
  $originalData = $record
      ->gzd
      ->originalData
      ->children($ns['overheidrg'])
      ->meta
      ->children();
  foreach ($originalData as $originalDataItem) {
    // Get the children using the namespace 'dcterms'
    $children = $originalDataItem->children($ns['dcterms']);
    // Check for the name of the xml element
    if ($originalDataItem->getName() === "owmskern") {
      $identifier = $children->identifier->__toString();
      // etc...
    }
    if ($originalDataItem->getName() === "owmsmantel") {
      $isFormatOf = $children->isFormatOf->__toString();
      // etc...
    }
  }
}