我正在尝试遍历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
}
问题是$ orginalData保持为空,可能是因为节点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><al >Geen</al></overheidrg:gedelegeerdeRegelgeving>
<overheidrg:redactioneleToevoeging><al >Geen</al></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>
答案 0 :(得分:0)
您可以将SimpleXMLElement
children方法与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><al >Geen</al></overheidrg:gedelegeerdeRegelgeving>
<overheidrg:redactioneleToevoeging><al >Geen</al></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...
}
}
}