简体   繁体   中英

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

I am trying to loop through a set of records in an XML document, but cannot access subnodes that are in other namespaces.

this is my php code:

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

The problem is that $orginalData remains empty, probably because al the subnodes inside node originalData belong to other namespaces. My question is: how do I get these subnodes available in my records loop? I need all the nodes that are under the dcterms namespace.

Here is the source 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>

You can use the SimpleXMLElement children method with the corresponding namespaces like children($ns['overheidrg']) and children($ns['dcterms']) .

For example:

$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...
    }
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM